博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF1097D Makoto and a Blackboard
阅读量:5359 次
发布时间:2019-06-15

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

思路:

概率dp。首先对n进行因子分解得到,然后每个素因子pi,计算经过k次操作之后的期望值Ei,再利用期望的性质把所有Ei乘起来得到最终结果。Ei可以通过概率dp计算,dp[i][j]表示经过i次操作之后出现的概率。

实现:

1 #include 
2 using namespace std; 3 4 typedef long long ll; 5 6 const ll MOD = 1e9 + 7; 7 8 ll dp[10005][60]; 9 10 ll qpow(ll x, ll n)11 {12 ll res = 1;13 while (n)14 {15 if (n & 1) res = res * x % MOD;16 x = x * x % MOD;17 n >>= 1;18 }19 return res;20 }21 22 ll inv(ll x)23 {24 return qpow(x, MOD - 2);25 }26 27 map
fac(ll x)28 {29 map
ans;30 for (ll i = 2; i * i <= x; i++)31 {32 while (x % i == 0)33 {34 x /= i;35 ans[i]++;36 }37 }38 if (x != 1) ans[x] = 1;39 return ans;40 }41 42 int main()43 {44 ll n; int k;45 while (cin >> n >> k)46 {47 map
ans = fac(n);48 ll res = 1;49 for (auto it: ans)50 {51 memset(dp, 0, sizeof dp);52 ll tmp = it.first; int cnt = it.second;53 dp[0][cnt] = 1;54 for (int i = 1; i <= k; i++)55 {56 dp[i][cnt] = dp[i - 1][cnt] * inv(cnt + 1) % MOD;57 for (int j = cnt - 1; j >= 0; j--)58 {59 dp[i][j] = dp[i][j + 1];60 dp[i][j] = (dp[i][j] + dp[i - 1][j] * inv(j + 1)) % MOD;61 }62 }63 ll sum = 0;64 for (int i = 0; i <= cnt; i++)65 {66 sum = (sum + dp[k][i] * qpow(tmp, i) % MOD) % MOD;67 }68 res = res * sum % MOD;69 }70 cout << res << endl;71 }72 return 0;73 }

转载于:https://www.cnblogs.com/wangyiming/p/10229100.html

你可能感兴趣的文章
一个控制台程序,模拟机器人对话
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>
解决响应式布局下兼容性的问题
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>
Spring Bean InitializingBean和DisposableBean实例
查看>>
[容斥][dp][快速幂] Jzoj P5862 孤独
查看>>
Lucene 学习之二:数值类型的索引和范围查询分析
查看>>
软件开发工作模型
查看>>
Java基础之字符串匹配大全
查看>>
面向对象
查看>>
lintcode83- Single Number II- midium
查看>>
移动端 响应式、自适应、适配 实现方法分析(和其他基础知识拓展)
查看>>
selenium-窗口切换
查看>>
使用vue的v-model自定义 checkbox组件
查看>>
[工具] Sublime Text 使用指南
查看>>