蒟蒻数学渣呀,根本不会做。

解法是参考 https://blog.csdn.net/xs18952904/article/details/88785210 这位大佬的。

状态的设计和转移如上面博客一样:dp[i]代表当前序列的gcd为i的期望长度。

那么可以写出状态转移方程:dp[i]=(1+(x/m)∑(j|i,j≠i)dp[j]) / (1-(m/i)/m) (写得有点乱,其实和上面大佬的一样的)

这里要说一下的是 x=∑(t=1,t<=m) [ gcd(t,i)==j ]  就是怎么求1<=t<=m 中gcd(t,i)=j的t的个数。

这里考虑莫比乌斯反演:

x=∑(t=1,t<=m)[gcd(t,i)=j]

把j提出来 x=∑(t=1,t<=m/j) [gcd(t,i/j)=1]

代入莫比乌斯性质:x=∑(t=1,t<=m) ∑(d|gcd(t,i/j)) μ(d)

套路,改为枚举d : x=(m/jd)(d|(i/j)) μ(d)

这样就可以求出x了,这道题就可以解决了。

时间复杂度为O(m*log(m)*因子个数)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+;
const int MOD=1e9+;
LL m,mu[N],v[N],dp[N]; LL power(LL x,LL p) {
LL ret=;
for (;p;p>>=) {
if (p&) ret=(ret*x)%MOD;
x=(x*x)%MOD;
}
return ret;
} vector<int> fac[N];
void prework() {
for (int i=;i<=m;i++)
for (int j=;j<=m/i;j++)
fac[i*j].push_back(i);
for (int i=;i<=m;i++) mu[i]=,v[i]=;
for (int i=;i<=m;i++) {
if (v[i]) continue;
mu[i]=-;
for (int j=*i;j<=m;j+=i) {
v[j]=;
if ((j/i)%i==) mu[j]=;
else mu[j]*=-;
}
}
} LL calc(LL i,LL j) {
LL ret=;
for (int k=;k<fac[i/j].size();k++) {
int d=fac[i/j][k];
LL tmp=(mu[d]+MOD)%MOD*(m/j/d)%MOD;
ret=(ret+tmp)%MOD;
}
return ret;
} int main()
{
cin>>m;
prework();
LL ans=; dp[]=;
for (int i=;i<=m;i++) {
dp[i]=;
for (int j=;j<fac[i].size();j++) {
if (fac[i][j]==i) continue;
LL x=calc(i,fac[i][j]);
dp[i]=(dp[i]+x*dp[fac[i][j]]%MOD)%MOD;
}
dp[i]=dp[i]*power(m,MOD-)%MOD;
dp[i]=(dp[i]+)%MOD;
dp[i]=(dp[i]*m%MOD*power(m-m/i,MOD-))%MOD;
ans=(ans+dp[i]*power(m,MOD-)%MOD)%MOD;
}
cout<<ans<<endl;
return ;
}

Codeforces - 1139D - Steps to One (概率DP+莫比乌斯反演)的更多相关文章

  1. codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)

    题目链接: http://codeforces.com/contest/1139/problem/D 题意: 在$1$到$m$中选择一个数,加入到一个初始为空的序列中,当序列的$gcd$和为$1$时, ...

  2. Codeforces.1139D.Steps to One(DP 莫比乌斯反演)

    题目链接 啊啊啊我在干什么啊.怎么这么颓一道题做这么久.. 又记错莫比乌斯反演式子了(╯‵□′)╯︵┻━┻ \(Description\) 给定\(n\).有一个初始为空的集合\(S\).令\(g\) ...

  3. CodeForces 24D Broken robot (概率DP)

    D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. CodeForces 540D--Bad Luck Island(概率DP)

    貌似竟然是我的第一道概率DP.. 手机码代码真不舒服.... /************************************************ Memory: 67248 KB Ti ...

  5. codeforces 148D Bag of mice(概率dp)

    题意:给你w个白色小鼠和b个黑色小鼠,把他们放到袋子里,princess先取,dragon后取,princess取的时候从剩下的当当中任意取一个,dragon取得时候也是从剩下的时候任取一个,但是取完 ...

  6. Codeforces 809E - Surprise me!(虚树+莫比乌斯反演)

    Codeforces 题目传送门 & 洛谷题目传送门 1A,就 nm 爽( 首先此题一个很棘手的地方在于贡献的计算式中涉及 \(\varphi(a_ia_j)\),而这东西与 \(i,j\) ...

  7. Codeforces 1139D Steps to One dp

    Steps to One 啊, 我要死了, 这种垃圾题居然没写出来, 最后十分钟才发现错在哪. 不知道为什么我以为 对于一个数x , 除了它的因子和它的倍数都是和它互质的, 我脑子是抽了吗? 随便瞎d ...

  8. Codeforces 148D Bag of mice 概率dp(水

    题目链接:http://codeforces.com/problemset/problem/148/D 题意: 原来袋子里有w仅仅白鼠和b仅仅黑鼠 龙和王妃轮流从袋子里抓老鼠. 谁先抓到白色老师谁就赢 ...

  9. CodeForces 148D-Bag of mice(概率dp)

    题意: 袋子里有w个白球b个黑球,现在两个人轮流每次取一个球(不放回),先取到白球的获胜,当后手取走一个球时,袋子里的球会随机的漏掉一个,问先手获胜的概率. 分析: dp[i][j]表示袋子中i个白球 ...

随机推荐

  1. APScheduler的简单记录

    此工具作为 定时任务调度 系统,在日常业务中经常使用,如定时获取第三方数据,定时清理数据 等等: 定时任务 和 业务逻辑 编写方式 一般有2种: 以 定时 清理db数据为例,在flask中,如下: 1 ...

  2. 轻量级Spring定时任务(Spring-task)

    Spring3.0以后自主开发的定时任务工具,spring-task,可以将它比作一个轻量级的Quartz,而且使用起来很简单,除spring相关的包外不需要额外的包,而且支持注解和配置文件两种形式. ...

  3. windows下基于(QPC)实现的微秒级延时

    1.为什么会写windows下微秒级延时 在上一篇 实现memcpy()函数及过程总结 中测试memcpy的效率中,测试时间的拷贝效率在微秒级别,需要使用微秒级时间间隔计数. windows下提供Qu ...

  4. react 使用axios

    1.配置axios代理  使得axios  可以不写根路径 package.json "proxy":"http://localhost:4000", 2.使用 ...

  5. Spring、SpringMVC、SpringBoot、SpringCloud概述

    spring和springMvc: 1. spring是一个一站式的轻量级的java开发框架,核心是控制反转(IOC)和面向切面(AOP),针对于开发的WEB层(springMvc).业务层(Ioc) ...

  6. enumerate()(Python)

    >>> E=enumerate('spam') >>> E <enumerate object at 0x1021ceca8> >>> ...

  7. js 中数组传递到后台controller 批量删除

    /*批量删除*/function datadel(url) { var ids=[]; $("input[type='checkbox']:checked").each(funct ...

  8. flutter Could not find the built application bundle

    报错信息Could not find the built application bundle at build/ios/iphoneos/Runner.app. Error launching ap ...

  9. if语句里面continue和break的区别

    break:结束整个循环体 continue:结束本次循环 代码说明: public static void main(String[] args) { int x=0; while(x++ < ...

  10. Linux虚拟机网络连接的三种方式

    Bridge桥接模式.NAT模式.Host-only仅主机模式: 桥接模式:虚拟机使用真实网卡进行通信,配置简单:只要和真实计算机在同一个网段内,就可以直接通信:局域网内如果有其他计算机,也可以进行访 ...