题目链接:传送门

题目大意:

  给出一个整数n写在黑板上,每次操作会将黑板上的数(初始值为n)等概率随机替换成它的因子。

  问k次操作之后,留在黑板上的数的期望。

  要求结果对109+7取模,若结果不是整数,则用分数表示,并对109+7取逆元。

  (1 ≤ n ≤ 1015, 1 ≤ k ≤ 104

思路:

  首先我们要知道,在模109+7的范围内,可以任意进行模109+7的加减乘除运算,因为一个给定的数值,它在模109+7条件下的值是唯一确定的。

  然后我们只要正常地计算,在每次运算之后对109+7取模就好了。

  假设一个数pj的出现概率为x,其中p为质数,j为任意非负整数(假设初始的数为pcc的话,那么0 ≤ j ≤ cc)。那么一次操作留下的数只能是pt(0 ≤ t ≤ j),因为是等概率分布,所以每个留下的数的概率均为x/j = x * inv(j)。(inv表示在模109+7下取逆元)

  标记状态:dp[i][j]为第i次操作后p的j次幂出现的概率;

  那么状态转移方程为:dp[i+1][t] += dp[i][j] * inv(j);(0 ≤ t ≤ j)

  而题目给出的数可能不是一个质数的幂,这怎么办呢?我们知道任意一个正整数可以表示为p1cc1*p2cc2*…*pkcck,对于所有的picci,他们留下的数piji的乘积就是最后留下的数,所以他们对答案的贡献的乘积就是最后的答案。

代码:

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. typedef long long ll;
  5. const int md = 1e9 + ;
  6.  
  7. inline void add(int& a, int b) {
  8. a += b;
  9. if (a > md)
  10. a -= md;
  11. }
  12.  
  13. inline void sub(int& a, int b) {
  14. a -= b;
  15. if (a < )
  16. a += md;
  17. }
  18.  
  19. inline int mul(int a, int b) {
  20. return (int) (1LL * a * b % md);
  21. }
  22.  
  23. int fpow(int a, int p) {
  24. int res = ;
  25. for (; p; p >>= ) {
  26. if (p & )
  27. res = mul(res, a);
  28. a = mul(a, a);
  29. }
  30. return res;
  31. }
  32.  
  33. int inv(int x) {
  34. return fpow(x, md-);
  35. }
  36.  
  37. int main()
  38. {
  39. std::ios::sync_with_stdio(false);
  40. cin.tie(nullptr);
  41. ll n;
  42. int k;
  43. cin >> n >> k;
  44. vector <pair<ll, int> > f;
  45. for (ll i = ; i <= n/i; i++) {
  46. if (n % i == ) {
  47. int cc = ;
  48. while (n % i == ) {
  49. n /= i;
  50. cc++;
  51. }
  52. f.emplace_back(i, cc);
  53. }
  54. }
  55. if (n > )
  56. f.emplace_back(n, );
  57.  
  58. int ans = ;
  59. for (auto& p : f) {
  60. int cc = p.second;
  61. vector <vector<int> > dp(k+, vector<int>(cc+, ));
  62. dp[][cc] = ;
  63. for (int i = ; i < k; i++) {
  64. for (int j = ; j <= cc; j++) {
  65. int tmp = mul(dp[i][j], inv(j+));
  66. for (int t = ; t <= j; t++)
  67. add(dp[i+][t], tmp);
  68. }
  69. }
  70.  
  71. int x = , res = ;
  72. for (int i = ; i <= cc; i++) {
  73. add(res, mul(x, dp[k][i]));
  74. x = mul(x, (int)(p.first % md));
  75. }
  76. ans = mul(ans, res);
  77. }
  78. cout << ans << endl;
  79. return ;
  80. }

Codeforces1097D. Makoto and a Blackboard(数论+dp+概率期望)的更多相关文章

  1. [LnOI2019]加特林轮盘赌(DP,概率期望)

    [LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...

  2. codeforces1097D Makoto and a Blackboard 数学+期望dp

    题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp  好题好题!! ...

  3. codeforces#1097 D. Makoto and a Blackboard(dp+期望)

    题意:现在有一个数写在黑板上,它以等概率转化为它的一个约数,可以是1,问经过k次转化后这个数的期望值 题解:如果这个数是一个素数的n次方,那么显然可以用动态规划来求这个数的答案,否则的话,就对每个素因 ...

  4. hdu-5816 Hearthstone(状压dp+概率期望)

    题目链接: Hearthstone Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Other ...

  5. hdu-5781 ATM Mechine(dp+概率期望)

    题目链接: ATM Mechine Time Limit: 6000/3000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Other ...

  6. BZOJ3566:[SHOI2014]概率充电器(树形DP,概率期望)

    Description 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品——概率充电器: “采用全新纳米级加工技术,实现元件与导线能否通电完全由真随机数决定!SHOI 概率充电器, ...

  7. BZOJ4008:[HNOI2015]亚瑟王(DP,概率期望)

    Description 小 K 不慎被 LL 邪教洗脑了,洗脑程度深到他甚至想要从亚瑟王邪教中脱坑. 他决定,在脱坑之前,最后再来打一盘亚瑟王.既然是最后一战,就一定要打得漂亮.众所周知,亚瑟王是一个 ...

  8. CF1097D Makoto and a Blackboard

    题目地址:CF1097D Makoto and a Blackboard 首先考虑 \(n=p^c\) ( \(p\) 为质数)的情况,显然DP: 令 \(f_{i,j}\) 为第 \(i\) 次替换 ...

  9. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

随机推荐

  1. 安装cmake 和 opencv 4.0.0

    1.安装cmake3.5.1或更新的版本 安装gcc-c++:sudo apt-get install build-essential (或者直接执行这两条命令sudo apt-get install ...

  2. SQL SEVER 开窗函数总结

    作为一名刚刚入门的开发人员,要学的东西很多很多,有些无从下手.秉着“问题是病.技术是药.对症下药”的原则,将工作中遇到的问题所需的技术进行梳理.归纳和总结. 一.什么是开窗函数 首先,什么是开窗函数, ...

  3. JavaScript 进制转换

    //十进制转其他 var x=111; alert(x.toString(8)); alert(x.toString(16)); //其他转十进制 var x='112'; alert(parseIn ...

  4. 网络编程-day2

    1 网络通信协议 Tcp udp的区别 重点(*****) TCP(Transmission Control Protocol)可靠的.面向连接的协议(eg:打电话).传输效率低全双工通信(发送缓存& ...

  5. 关于memset函数--赋最大值

    问题起源: 这几天在刷CCF的时候,图论那边经常用到赋最大值,一开始自己一直手工for循环赋值(INT_MAX或者是LONG_LONG_MAX),后来看到别人的代码,发现了一个比较高端的赋值  mem ...

  6. android 重启app

    package com.xproject.utility; import java.lang.reflect.Field; import java.lang.reflect.InvocationTar ...

  7. vue+uwsgi+nginx部署前后端分离项目

    前后端分离,vue前端提供静态页面,且可以向后台发起get,post等restful请求. django后台提供数据支撑,返回json数据,返回给vue,进行数据页面渲染 后端 创建虚拟环境 解决dj ...

  8. tensorflow 只恢复部分模型参数

    import tensorflow as tf def model_1(): with tf.variable_scope("var_a"): a = tf.Variable(in ...

  9. Android中软键盘展示、EditText焦点获取及windowSoftInputMode属性探究

    2017-08-14 21:44:23 有很多中情况,分别展示. 1.Activity不做任何设置,布局使用LinearLayout 会自动滚动EditText之上的所有View,代码: <?x ...

  10. 动态规划Dynamic Programming

    动态规划Dynamic Programming code教你做人:DP其实不算是一种算法,而是一种思想/思路,分阶段决策的思路 理解动态规划: 递归与动态规划的联系与区别 -> 记忆化搜索 -& ...