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

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. System Center Configuration Manager 2016 域准备篇(Part2)

    对于" 服务器角色",请选择" Active Directory域服务",当系统提示您添加Active Directory域服务所需的功能时,请选择" ...

  2. shell实现mysql数据库备份

    #!/bin/bash DB_USER="root" #数据库用户名 DB_PASS="12345678" #数据库密码 BACK_DIR="/bac ...

  3. 解决IE下面诡异地使用quickrIE5模式打开页面的有关问题

    解决IE下面诡异地使用quickrIE5模式打开页面的有关问题 <!doctype html public "-//w3c//dtd html 4.01 transitional//e ...

  4. spring xml 配置文件中标签的解析

    一个springmvc配置文件的例子为: <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...

  5. .NET中变量生存期

    Web窗体后台 cs 文件中,创建类作用域的变量,在关闭页面的时候并不会消失,当 IIS 站点被关闭的时候,才会调用这个变量的析构函数 但是好像也不肯定在关闭站点才会析构,应该是外层对象析构的时候才会 ...

  6. C/C++程序基础 (八)数据结构

    非递归先序遍历 // 输出, 遍历左子树,遍历右子树 void firstOrder(Node* root) { stack<Node*> leftNodes; Node* curr = ...

  7. Jquery 就是怎么取得一个select的当前值

    <select id="cursel">: <option value="1">值1</option>: <optio ...

  8. 5-1 json模块

    1.json.loads(json_str)  把字符串(json串)转成字典 import json # 解析json的 json_str = ''' {"name":" ...

  9. PS1

    linux系统终端命令提示符设置(PS1)记录 - 散尽浮华 - 博客园 https://www.cnblogs.com/kevingrace/p/5985970.html PS(Prompt Sig ...

  10. PHP去掉字符串中的数字

    这个比较简单,但是也有些需要注意的地方,先贴代码 $class=preg_replace("\\d+",'', $res); 需要使用preg_replace函数,但是只是这么写的 ...