博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
A - Race to 1 Again
阅读量:4350 次
发布时间:2019-06-07

本文共 1558 字,大约阅读时间需要 5 分钟。

题目

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

31250

Sample Output

Case 1: 0Case 2: 2.00Case 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
#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]); }}

转载于:https://www.cnblogs.com/dgklr/p/11181115.html

你可能感兴趣的文章
iptables防火墙网路安全实践配置
查看>>
ASP.net Web窗体添加多条数据到数据库
查看>>
PHP面向对象(三)
查看>>
mysql与实际时间有8小时差怎么办
查看>>
docker 常用命令
查看>>
微信小程序 - 参数传递
查看>>
在Centos7上安装Oracle
查看>>
Linux下启动/关闭Oracle
查看>>
session和cookie的区别
查看>>
oracle 数据库、实例、服务名、SID
查看>>
web.xml文件的作用
查看>>
linux下oracle调试小知识
查看>>
alert弹出窗口,点击确认后关闭页面
查看>>
oracle问题之数据库恢复(三)
查看>>
单点登陆(SSO)
查看>>
HR,也确实“尽职尽责”
查看>>
MaxComputer 使用客户端配置
查看>>
20190823 顺其自然
查看>>
阅读《余生有你,人间值得》有感
查看>>
每日英语
查看>>