CF1097D Makoto and a Blackboard

思路:

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

实现:

 1 #include <bits/stdc++.h>
 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<ll, int> fac(ll x)
28 {
29     map<ll, int> 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<ll, int> 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

时间: 2024-10-14 03:20:05

CF1097D Makoto and a Blackboard的相关文章

CF1097D 【Makoto and a Blackboard】

我们考虑对于一个\(N\),他如果变成了他的约数\(x\),那又会变成一个子问题 我们定义\(F(n, k)\)为n操作k次的期望个数 那么我们有\(F(n, k) =\sum_{x|n} F(x, k - 1) * \frac{1}{d}\)(其中d为n的约数个数) 因为\(N\)的约数个数肯定在\(\sqrt N\)以内现在我们就有了一个\(O(\sqrt N K)\)的暴力了 前面的\(\sqrt N\)肯定是不能省略了,我们可不可以对\(K\)下手呢? 我们考虑\(N\)是质数,那么答案

CF 1097D - Hello 2019 D题: Makoto and a Blackboard

目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门 ?Portal ?原题目描述在最下面. ?给一个数n,由k次操作.每次操作等概率的把n变成他的一个因数(\(1\leq x\leq n\)),问k次操作后得到的数的期望是多少. Solution: \(n = p1^{a1}*...*pm^{am}\) 积性函数: \(fk(n) = fk(p1^{a1})*...*fk(pm^{am})\) \(dp[j]\

codeforces1097D Makoto and a Blackboard 数学+期望dp

题目传送门 题目大意: 给出一个n和k,每次操作可以把n等概率的变成自己的某一个因数,(6可以变成1,2,3,6,并且概率相等),问经过k次操作后,期望是多少? 思路:数学和期望dp  好题好题!! 直接考虑n到因子很难做,所以要研究从n到因子的一些性质. 如果一个数可以写成,p^c这样的形式,并且p是质数,那么如果把这个数进行上述的操作,他可以变成的形式必然是p^x(0<=x<=c),并且每个数的概率是平均的. 所以对于这样的数,我们可以得出dp方程,i表示第几次操作,j表示p^j. dp[

Hello 2019

目录 D.Makoto and a Blackboard E. F.Alex and a TV Show G. H. 比赛链接 咕咕了一个月...终于闲的没事想起补了... ABC代码没在本地(而且懒),就不放了... (然而当时C题FST了真是想...= =) D.Makoto and a Blackboard \(Description\) 给定\(n,k\).每次\(n\)会等概率地变成自己的一个约数(包括\(1,n\)),求变化\(k\)次后\(n\)期望是多少. \(n\leq10^{

【canvas】blackboard 黑板

本来想的挺复杂实际操作了一下15分钟完成了,挺简单的. 分享一下思路: 1.创建画布 2.添加按钮 3.设置事件 没啥好说的就这样吧. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>blackboard</title> <style> *{margin: 0;padding: 0;} #wa

ubuntu中vim找不到配色方案blackboard

在ubuntu下启动vim,提示找不到配色方案blackboard(或其他的), 如何挑选自己喜欢的配色方案呢?在/usr/share/vim/vim72/colors中,(这里根据自己的vim版本选择相应的文件夹) 可以看到很多文件,这些文件就是vim自带的配色方案.比如我们要把配色方案设置为blue.vim,(这个是最难看的) colorscheme  delek delek和koehler这两个稍微好看点,其他真TM难看 则我们可以centos中打开/etc/vimrc,找到colorsc

【CF878E】Numbers on the blackboard 并查集

[CF878E]Numbers on the blackboard 题意:给你一个长度为n个数列,你每次可以进行如下操作: 选取两个相邻的数x,y(x在y左面),然后将这两个数去掉,用x+2y替换它. 重复此操作直到序列中只有一个数为止.你可以任意决定每次合并哪两个数,求最后得到的数的最大值. 为了加大难度,现有q次询问,每次询问给出l,r,问你对[l,r]这段区间进行操作能得到的最大值是什么. n,q<=100000,ai<=10^9 题解:先不考虑l,r的限制,整个操作可以看成:让你最大化

2015-2016 Petrozavodsk Winter Training Camp, Makoto rng_58 Soejima Сontest 4题解

传送门 被\(jz\)姐姐带着飞--代码的话直接在上面找吧 \(A\) 发现这样的数不会很多,直接把所有的都打表打出来就行了 \(B\) 转换成切比雪夫距离后,每个点分别向\(x,y\)坐标最大最小的点连边,跑个最大生成树就行了 \(C\) 最终的柿子一定行如\(s\pm t=2a_{i_1}-2a_{i_2}+...\),那么直接\(bfs\)出所有可能的结果,然后根据奇偶性判断一下就行了 原文地址:https://www.cnblogs.com/yuanquming/p/11715366.h

Ubuntu16.04下使用sublime text3搭建Python IDE

本来是想用pycharm,但你看它的内存要求,我的虚拟机一共也就1G Vim太别扭了,就算有代码颜色,不能自动对齐,不能规范格式,跳转到函数定义,显示文档,要配置起来太费劲,所以就尝试着用sublime text3 来搭建Python IDE 安装sublime text3 目前最简单的方法是通过ppa安装,打开终端,输入以下命令: sudo add-apt-repository ppa:webupd8team/sublime-text-3 sudo apt-get update sudo ap