题意是模拟一个循环,一开始有一个空序列,之后每次循环:

1.从1到m中随机选出一个数字添加进去,每个数字被选的概率相同。

2.检查这个序列的gcd是否为1,如果为1则停止,若否则重复1操作直至gcd为1为止。

求这个序列的长度期望。

也是花了一晚上学习了一下期望dp。

设dp[i]表示当前gcd为i,到gcd为1时添加的元素个数期望。

然后就是传统的期望dp模型了:

dp[i]=∑p[i→j]dp[j]+w[i→j]

此处w为1,因为每次是添加1个元素

初始化状态dp[1]=0,因为当gcd为1的时候已经无法再添加元素

状态转移就是枚举i的因数j,然后计算1到m中有多少个数字x使得gcd(x,i)=j,设个数为tp,另一方面,还要计算有多少个数字y使得gcd(y,i)=i,设个数为z,从而有:

z=m/i(此处除法为向下取整)

dp[i]=z/m*dp[i]+Σ(tp/m*dp[j])+1 (此处的除法为取模意义下的除法,即乘以逆元)

也就是

dp[i]=(Σ(tp/m*dp[j])+1)*m/(m-z) (除法意义同上)

最后,由于起点并未明确确定,此处要手动设定起点,对于每个起点,都有1/m的概率选到,所以答案就是

1+Σdp[i]/m (取模下除法)

至于求tp,就是对x/i这个数字质因数分解之后容斥定理求个数,由于本人手残这部分写挂了好几次,终于也是在千辛万苦之后才写对

 #include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod=1e9+;
ll q_p(ll a,ll b)
{
ll ans=;
while(b)
{
if(b&)
{
ans*=a;
ans%=mod;
}
b>>=;
a*=a;
a%=mod;
}
return ans;
}
ll inv(ll x)
{
return q_p(x,mod-);
} ll ret;
vector<ll>vec;
void dfs(ll idx,ll dep,ll lim,ll num,ll tmp)
{
if(num>) return;
if(dep==lim)
{
if(lim%)
ret+=tmp/num;
else
ret-=tmp/num;
return;
}
if(idx>=vec.size()) return;
dfs(idx+,dep+,lim,num*vec[idx],tmp);
dfs(idx+,dep,lim,num,tmp);
} bool vis[];
ll calc(ll x,ll k,ll n)
{
ll tmp=n/k;
ll tt=x/k;
for(ll i=;;i++)
{
while(tt%i==)
{
if(!vis[i]) vec.push_back(i),vis[i]=;
tt/=i;
}
if(i>sqrt(tt)) i=tt-;
if(tt==) break;
}
ret=;
for(int i=;i<=vec.size();i++)
dfs(,,i,,tmp);
for(int i=;i<vec.size();i++) vis[vec[i]]=;
vec.clear();
return tmp-ret;
} ll dp[];
int main()
{
#ifdef amori
clock_t start = clock();
#endif //amori ll m;
cin>>m;
dp[]=;
ll invm=inv(m);
for(ll i=;i<=m;i++)
{
dp[i]=;
for(ll j=;j<=sqrt(i);j++)
{
if(i%j==)
{
//cout<<i<<" "<<j<<" "<<calc(i,j,m)<<" "<<calc(i,i/j,m)<<endl;
dp[i]+=dp[j]*invm%mod*calc(i,j,m);
dp[i]%=mod;
if(j!= && i!=j*j)
{
dp[i]+=dp[i/j]*invm%mod*calc(i,i/j,m);
dp[i]%=mod;
}
}
}
ll tp=m/i;
dp[i]=dp[i]*m%mod*inv(m-tp);
dp[i]%=mod;
}
ll sum=;
for(int i=;i<=m;i++)
{
sum+=dp[i];
sum%=mod;
}
cout<<sum*invm%mod+<<endl; #ifdef amori
clock_t end = clock();
cout<<"Done in "<<end-start<<"ms"<<endl;
#endif // amori
}

是不是写的很烂,写的很烂就对了

别人构造级数求和一下就过了,本蒟蒻还在搞期望dp,顶不住鸭。

Codeforces 1139D(期望dp)的更多相关文章

  1. Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp

    一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...

  2. [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)

    [Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...

  3. [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)

    [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...

  4. Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)

    题目链接:New Year and Arbitrary Arrangement 题意: 有一个ab字符串,初始为空. 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾 ...

  5. 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP

    [题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...

  6. 【算法学习笔记】概率与期望DP

    本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...

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

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

  8. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

  9. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

随机推荐

  1. ubuntu双屏调整分辨率

    查看屏幕硬件指标 # xrandr Screen 0: minimum 8 x 8, current 2390 x 768, maximum 32767 x 32767 LVDS1 connected ...

  2. redis在Windows下以后台服务一键搭建集群(多机器)

    redis在Windows下以后台服务一键搭建集群(多机器) 一.概述 此教程介绍如何在windows系统中多台机器之间布置redis集群,同时要以后台服务的模式运行.布置以脚本的形式,一键完成.多台 ...

  3. LeetCode Valid Parentheses 有效括号

    class Solution { public: void push(char c){ //插入结点 struct node *n=new struct node; n->nex=; n-> ...

  4. HDU 1712 ACboy needs your help AC男需要你的帮助 (分组的背包)

    分组背包问题:有N件物品和一个容量为V的背包.第i件物品的体积是c[i],价值是w[i].这些物品被划分为若干组,每组中的物品互相冲突,最多选一件.求解将哪些物品装入背包可使这些物品的体积总和不超过背 ...

  5. linux 命令——20 find(转)

    find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是command ...

  6. POJ 1742 Coins(多重背包,优化)

    <挑战程序设计竞赛>上DP的一道习题. 很裸的多重背包.下面对比一下方法,倍增,优化定义,单调队列. 一开始我写的倍增,把C[i]分解成小于C[i]的2^x和一个余数r. dp[i][j] ...

  7. 黑箱中的 retain 和 release

    https://github.com/Draveness/Analyze/blob/master/contents/objc/黑箱中的%20retain%20和%20release.md 写在前面 在 ...

  8. 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)

    点此看题面 大致题意: 给你\(N\)个单词,请你求出每一个单词在这\(N\)个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. \(AC\)自动机 这是一道\(AC\)自动机的简 ...

  9. 【BZOJ2243】[SDOI2011] 染色(树链剖分)

    点此看题面 大致题意: 有一棵\(n\)个节点的无根树和\(m\)个操作,且每个节点有一个颜色.操作有两种:一种是将两点树上路径之间所有点染成颜色\(c\),另一种是询问两点树上路径之间颜色段的数量. ...

  10. DOS&8086微处理器

    DOS DOS环境,需要安装dosemu来模拟DOS环境(Ubuntu的应用商店就有),为了编写汇编,还需要DEBUG.MASM.LINK等汇编语言开发工具.如果你嫌麻烦,推荐使用实验楼已搭好的免费的 ...