概率dp
2016-04-01 10:57
267 查看
题目:将一个数每次除以它的因子,求除到1的期望
思路:dp[1]=0;dp[i] = (dp[i] + sum(dp[j])(所有因子dp和)+ sum(因子个数和)+1)/sum(因子个数);
思路:dp[1]=0;dp[i] = (dp[i] + sum(dp[j])(所有因子dp和)+ sum(因子个数和)+1)/sum(因子个数);
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <fstream> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <vector> #include <map> #include <set> #include <iomanip> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define maxn 100005 #define MOD 1000000007 #define mem(a , b) memset(a , b , sizeof(a)) #define LL long long #define INF 100000000 int n; double dp[maxn]; void init() { for(int i = 3 ; i < maxn ; i ++) { double num = 0; //记录i因子个数 for(int j = 1 ; j*j <= i ; j ++ ) //求i因子个数 { if(i % j == 0) { dp[i] += dp[j]; //期望次数必须累加 num++; if(i / j != j && i / j != i) //保证平方数不重复 { dp[i] += dp[i/j]; num++; } } } dp[i] = (dp[i] + num + 1) / num; //累加了所有因子期望,每次的概率相等,取平均值 } } int main() { mem(dp , 0); dp[1] = 0.0;dp[2] = 2.0; init(); int t; cin >> t; while(t-- ) { scanf("%d" , &n); printf("%.6lf\n" , dp ); } return 0; }
相关文章推荐
- 封装OpenGL渲染为DLL,C#做UI显示
- UVA 825 Walking on the Safe Side(DP)
- 聚类分析
- JavaScript中getBoundingClientRect()方法详解
- 使用O-LLVM和NDK对Android应用进行混淆
- 如何增加学习感悟
- 深入理解PHP内核(十三)类的结构和实现
- opcode的执行
- [unix]secureCRT使用常见命令
- 一个小脚本遇到的问题之 Windows 命令行启动程序
- uboot下gpio驱动移植
- C#winform如何最小化主窗口
- storm实战入门一
- Storm分布式实时流计算框架相关技术总结
- 关于JVM的常见问题(二)
- Android 仿微信上传头像自定义(剪切、平移,缩放)
- 如何实现友盟第三方登录与分享
- CI框架随记1
- TTreeView 连接数据库,树状展示人员信息管理效果不错
- 【转】中间代码opcode的执行