Codeforces 1139D(期望dp)
题意是模拟一个循环,一开始有一个空序列,之后每次循环:
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)的更多相关文章
- Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp
一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\ ...
- [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)
[Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...
- [Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT)
[Codeforces 553E]Kyoya and Train(期望DP+Floyd+分治FFT) 题面 给出一个\(n\)个点\(m\)条边的有向图(可能有环),走每条边需要支付一个价格\(c_i ...
- Codeforces 908 D.New Year and Arbitrary Arrangement (概率&期望DP)
题目链接:New Year and Arbitrary Arrangement 题意: 有一个ab字符串,初始为空. 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾 ...
- 【CodeForces】913 F. Strongly Connected Tournament 概率和期望DP
[题目]F. Strongly Connected Tournament [题意]给定n个点(游戏者),每轮游戏进行下列操作: 1.每对游戏者i和j(i<j)进行一场游戏,有p的概率i赢j(反之 ...
- 【算法学习笔记】概率与期望DP
本文学习自 Sengxian 学长的博客 之前也在CF上写了一些概率DP的题并做过总结 建议阅读完本文再去接着阅读这篇文章:Here 前言 单纯只用到概率的题并不是很多,从现有的 OI/ACM 比赛中 ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- [NOIP2016]换教室 D1 T3 Floyed+期望DP
[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...
- HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)
题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...
随机推荐
- 如何在Ubuntu server中修改IP
详细请移步至博客https://blog.csdn.net/shenzhen_zsw/article/details/74025066 方法一. sudo ifconfig eth0 100.100 ...
- 获取win10 Insider Preview报错0x80080300
获取win10 Insider Preview报错0x80080300 1.msconfig2.隐藏Microsoft 服务3.disable 剩下的服务4.win + i, Update&s ...
- IOS view拖拽(触摸事件)
• iOS中的事件可以分为3大类型 触摸事件 加速计事件 远程控制事件 响应者对象 • 在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事 件.我们称之为“响应 ...
- 2018.10.26 NOIP2018模拟赛 解题报告
得分: \(0+10+10=20\)(\(T1\)死于假题面,\(T3\)死于细节... ...) \(P.S.\)由于原题是图片,所以我没有上传题目描述,只有数据. \(T1\):颜料大乱斗(点此看 ...
- os.walk 模块
os.walk()可以得到一个三元tupple(dirpath, dirnames, filenames),其中第一个为起始路径,第二个为起始路径下的文件夹,第三个是起始路径下的文件. 其中dirpa ...
- c# 科学计数法值转换成正常值,返回字符串
/// <summary> /// 科学计数法值转换成正常值 /// </summary> /// <param name="value">&l ...
- CUDA && GPU中dim3介绍
- 修改android studio中的avd sdk路径、avd sdk找不到的解决方案
要进行Android应用程序的开发,首先就要搭建好Android的开发环境,所需要的工具有如下4个:1.java JDK:2.Android SDK:3.Eclipse:4.ADT 1.java JD ...
- 黑马基础阶段测试题:定义一个int类型的数组,数组中元素为{5,7,3,9,4}。求出数组中的最小值,并判断最小值是否为偶数,如果是偶数则输出“最小值为偶数”,如果不是偶数则输出“最小值为奇数”。打印如下:
package com.swift; import java.util.Arrays; public class ArrayTest { public static void main(String[ ...
- select函数实例代码
select函数简解: selct 称之为多路复用IO,使用它可以让程序阻塞在select上,而非实际IO函数上. int select(int nfds, fd_set *readfds, fd_s ...