给定一个整数n,每次操作可以对当前数进行除以它的某个因子。除以哪个因子是随机的,求把n变成1的期望步数。
输入描述:
第一行一个整数T,表示测试数据组数。
接下来T行,每行一个整数,表示n。
T,n<=100000
输出描述:
对于每组测试数据,输出一行表示把n变成1的期望操作次数。保留4位小数。
示例1
输入
3
1
2
50
输出
0.0000
2.0000
3.0333
biancheng1.cppview raw1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| #include<bits/stdc++.h> using namespace std; #define M 100005 double dp[M]; vector<int>son[M]; double dfs(int n){ if(dp[n]<0){ double &res=dp[n]; int t=son[n].size(); res=t;
for(int i=0;i<son[n].size();i++){ int x=son[n][i]; if(x==n)continue; res+=dfs(x); } res=res/(t-1); } return dp[n]; } int main(){ for(int i=1;i<M;i++){ dp[i]=-1; for(int j=i;j<M;j+=i) son[j].push_back(i); } dp[1]=0; int cas,n,v=1; cin>>cas; while(cas--){ scanf("%d",&n); printf("%.4f\n",dfs(n)); } return 0; }
|