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

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

题意

\(T\in[1,10^4]\)组数据,每组给定一个数字\(n\in[1,10^5]\)\(n\)每次除以\(n\)的一个因子,商记为新的\(n\)。求\(n\)被除到\(1\)的期望次数,答案允许\(10^{-6}\)以内的误差。

解法

预处理出\([1,10^5]\)以内的所有\(n\)的期望,离线查询。

对于每个数\(n\),可以累加其因子的期望次数,然后除去\(n\)的因子数再\(+1\),记为\(n\)的期望次数。

原理

显然选中任何一个因子是等概率事件。

\(x\)被除到\(1\)的期望次数为\(E(x)\)\(n\)的因子为\(a_i\),选中\(a_i\)的概率为为\(P(A_i)\),则\[E(n)=\sum\limits_{a_i}\{[E(a_i)+1]P(A_i)\}\]。若记\(n\)的因子数为\(fac\),则由上式可得\[E(n)=\frac{\sum\limits^{fac}[E(a_i)+1]}{fac}=\frac{\sum\limits^{fac}E(a_i)}{fac}+1\]。若因子按大小排序,则最后一个因子必定是自身,即\[E(n)=\frac{\sum\limits^{fac-1}E(a_i)+E(n)}{fac}+1\],移项得\[E(n)=\frac{\sum\limits^{fac-1}E(a_i)+fac}{fac-1}\]

反思

学术须严谨。宁可煮久一些,也不可吃夹生饭。

代码

#include
#include
#include
#define reg register intusing namespace std;const int LIM = 1e5;double dp[LIM + 1];int main(){ for(reg i = 2; i <= LIM; ++ i){ double num = 0, ans = 0; for(reg j = 1; j * j <= i; ++ j){ if(i % j == 0){ ++ num; ans += dp[j]; if(j != i / j){ // 此处由于dp[i]还未计算,所以不特判i / j == i不影响答案。 ++ num; ans += dp[i / j]; // 同理 } } dp[i] = (ans + num) / (num - 1); // 经化简的公式 } } int T, Case = 0; scanf("%d", & T); while(T --){ int n; scanf("%d", & n); printf("Case %d: %.6f\n", ++ Case, dp[n]); } return 0;}

转载于:https://www.cnblogs.com/Divinity/p/10974570.html

你可能感兴趣的文章
剑指offer——python【第38题】二叉树的深度
查看>>
Log4Net日志组件使用
查看>>
Windows 10 使用压缩包安装MySQL8.0.12
查看>>
bzoj 1689: [Usaco2005 Open] Muddy roads 泥泞的路
查看>>
Android 代码库(自定义一套 Dialog通用提示框 )
查看>>
[Java]ArrayList、LinkedList、Vector、Stack的比较
查看>>
我为什么要写博客,写博客给我带来了什么?
查看>>
Furure的简单介绍和使用
查看>>
jsp 监听器
查看>>
Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)...
查看>>
软件工程概论-作业之二
查看>>
豆瓣酱alpha版本发布了
查看>>
使用JavaMail发送邮件
查看>>
Netty - 1
查看>>
不要在using语句中调用WCF服务
查看>>
html文本框大全
查看>>
数据库架构
查看>>
生成jFinal的动态条件查询语句的工具类
查看>>
避免构造/析构函数调用虚函数(转)
查看>>
tornado中使用Mako模版
查看>>