LightOJ - 1038 Race to 1 Again

給一個數字,等概率選擇一個這個數字的除數,然後將這個數字除以這個除數,直到這個數字等於1,求這個數字等於1的期望次數。

我們用 dp[i] 表示這個數字的期望次數,對於每一個數字 i ,有

dp_i=\frac{\sum_{d|i}(1+dp_d)}{cnt_i},化簡後得 dp_i=\frac{\sum_{d|i}dp_d[d\ !=i]+cnt_i}{cnt_i - 1}

所以枚舉每一個數字,暴力跑一下他的因數

 

#include <bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
double dp[100005];
void init()
{
	for (int i = 2; i <= 100000; i++)
	{
		int cnt = 0;
		dp[i] += dp[1];
		cnt += 2;
		for (int j = 2; j <= sqrt(i); j++)
		{
			if (i % j == 0)
			{
				dp[i] += dp[j];
				cnt++;
				if (j != i / j)
				{
					dp[i] += dp[i / j];
					cnt++;
				}
			}
		}
		dp[i] = (dp[i] + cnt) / (cnt - 1);
	}
}
int main()
{
	init();
	int T, cas = 1;
	sc("%d", &T);
	while (T--)
	{
		int n;
		sc("%d", &n);
		printf("Case %d: %.9lf\n", cas++, dp[n]);
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章