A - Race to 1 Again
2024-10-07 07:42:29
题目
Rimi learned a new thing about integers, which is - any positive integer greater than 1 can be divided by its divisors. So, he is now playing with this property. He selects a number N. And he calls this D.
In each turn he randomly chooses a divisor of D (1 to D). Then he divides D by the number to obtain new D. He repeats this procedure until D becomes 1. What is the expected number of moves required for N to become 1.
Input
Input starts with an integer T (≤ 10000), denoting the number of test cases.
Each case begins with an integer N (1 ≤ N ≤ 105).
Output
For each case of input you have to print the case number and the expected value. Errors less than 10-6 will be ignored.
Sample Input
3
1
2
50
Sample Output
Case 1: 0
Case 2: 2.00
Case 3: 3.0333333333
大意
给出一个数,每次随机处一个它的因子,求他变成1的期望次数。
题解
令 f[I] 表示i在f[i]此后变成1。
\[f[i] = \sum_{j|i} (f[j]+1) / k, (k = \sum_j [j|i])
\]
\]
代码
#include<bits/stdc++.h>
#define repeat(a,b,c,g) for (int a=b,abck=(g>=0?1:-1);abck*(a)<=abck*(c);a+=g)
using namespace std;
double f[110000];
int main()
{
f[1] = 0;
for (int i=2;i<=100000;i++)
{
double tot = 0;
int tp = -1;
for (int j=1;j<=sqrt(i);j++)
{
if (i % j == 0)
{
tp ++, tot += f[j] + 1;
if (j * j != i)
tp ++, tot += f[i/j] + 1;
}
}
f[i] = tot / tp;
}
int n;
cin >> n;
for (int i=1;i<=n;i++)
{
int tmp;
cin >> tmp;
printf("Case %d: %.7f\n",i,f[tmp]);
}
}
最新文章
- Android权限管理之Permission权限机制及使用
- 不注册Tomcat服务,运行Tomcat不弹出JAVA控制台窗口
- 使用抓包工具SpyNet对你的网络进行监控
- java反射机制一个例子
- AppCan做的图片上传代码
- Android中将Bitmap对象以PNG格式保存在内部存储中
- js replace如何实现全部替换
- C#.net时间戳转换
- [LeetCode] 55. Jump Game 解题思路
- E - The King
- D3D 扎带 小样本
- 自学Unity3D 之 贪吃蛇 添加摄像机跟随
- My Calendar III
- 运用jieba库分词
- word20161227客厅家电
- linux安装mysql8.0及开启远程访问
- 如何修复“网络路径”,错误代码0x80070035
- 动态sql and在前 逗号在后
- 关于VXLAN的认识-----ovs+vxlan多链路负载分担的实现方法
- 【Android】TypedArray和obtainStyledAttributes使用