codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)
题目链接:
http://codeforces.com/contest/1139/problem/D
题意:
在$1$到$m$中选择一个数,加入到一个初始为空的序列中,当序列的$gcd$和为$1$时,停止加入,求序列的期望长度
数据范围:
$1 \leq m \leq 10^{9}$
分析:
定义$f[x$]为$gcd$等于$x$时把序列$gcd和$改变成1的期望长度,定义$G(x,y)$为$i$在1到$n$范围,满足$gcd(x,i)=y$,$i$的数量,得到以下公式:
$$f[i]=1+\frac{\sum_{d|i}f[d]\times G(i,d)}n,x=i$$
由于公式两边都有$f[i]$(因为$i|i$),所以对公式进行变换:
$$f[i]=1+\frac{\sum_{d|i,d<i}f[d]\times G(i,d)+f[i]\times G(i,i)}n,x=i$$
$$\frac{n-G(i,i)}{n}\cdot f[i]=1+\frac{\sum_{d|i,d<i}f[d]\times G(i,d)}n,x=i$$
$$f[i]=\frac{n+\sum_{d|i,d<i}f[d]\times G(i,d)}{n-G(i,i)},x=i$$
然后就是用莫比乌斯反演快速求出$G(x,y)$即可
$$G(x,y)=\sum_{d|\frac xy}\mu(d)\left\lfloor\frac{n}{d*y}\right\rfloor$$
ac代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10;
const int mod=1e9+7;
ll f[maxn],n;
int pri[maxn],mu[maxn],is[maxn],cnt;
vector<int>ve[maxn];
int cal(int x,int y)//i 在 1-n gcd(x,i)=y;
{
int dd=x/y,res=0;
for(int i=0;i<ve[dd].size();i++)
{
int p=ve[dd][i];
res=res+mu[p]*(n/y)/p;
}
return res;
}
ll qpow(ll x,ll y)
{
ll res=1,k=x;
while(y)
{
if(y&1)res=res*k%mod;
k=k*k%mod;
y/=2;
}
return res;
}
int getu()
{
mu[1]=1;
for(int i=2;i<=n;++i)
{
if(!is[i])
{
pri[++cnt]=i;
mu[i]=-1;
}
for(int j=1;j<=cnt&&i*pri[j]<=n;++j)
{
is[i*pri[j]]=1;
if(i%pri[j])
mu[i*pri[j]]=-mu[i];
else
{
mu[i*pri[j]]=0;
break;
}
}
}
}
void init()
{
getu();
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j+=i)ve[j].push_back(i);
}
int main()
{
ll ans=0;
scanf("%d",&n);
init();
for(int i=1;i<=n;i++)
{
f[i]=n;
for(int j=0;j<ve[i].size();j++)
{
int d=ve[i][j];
if(i==d)continue;
f[i]=(f[i]+f[d]*cal(i,d)%mod)%mod;
}
f[i]=f[i]*qpow(n-cal(i,i),mod-2)%mod;
ans=(ans+f[i])%mod;
}
printf("%d\n",(ans*qpow(n,mod-2)%mod+1)%mod);
return 0;
}
codeforces#1139D. Steps to One (概率dp+莫比乌斯反演)的更多相关文章
- Codeforces - 1139D - Steps to One (概率DP+莫比乌斯反演)
蒟蒻数学渣呀,根本不会做. 解法是参考 https://blog.csdn.net/xs18952904/article/details/88785210 这位大佬的. 状态的设计和转移如上面博客一样 ...
- Codeforces.1139D.Steps to One(DP 莫比乌斯反演)
题目链接 啊啊啊我在干什么啊.怎么这么颓一道题做这么久.. 又记错莫比乌斯反演式子了(╯‵□′)╯︵┻━┻ \(Description\) 给定\(n\).有一个初始为空的集合\(S\).令\(g\) ...
- CodeForces 24D Broken robot (概率DP)
D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- CodeForces 540D--Bad Luck Island(概率DP)
貌似竟然是我的第一道概率DP.. 手机码代码真不舒服.... /************************************************ Memory: 67248 KB Ti ...
- codeforces 148D Bag of mice(概率dp)
题意:给你w个白色小鼠和b个黑色小鼠,把他们放到袋子里,princess先取,dragon后取,princess取的时候从剩下的当当中任意取一个,dragon取得时候也是从剩下的时候任取一个,但是取完 ...
- Codeforces 809E - Surprise me!(虚树+莫比乌斯反演)
Codeforces 题目传送门 & 洛谷题目传送门 1A,就 nm 爽( 首先此题一个很棘手的地方在于贡献的计算式中涉及 \(\varphi(a_ia_j)\),而这东西与 \(i,j\) ...
- Codeforces 1139D Steps to One dp
Steps to One 啊, 我要死了, 这种垃圾题居然没写出来, 最后十分钟才发现错在哪. 不知道为什么我以为 对于一个数x , 除了它的因子和它的倍数都是和它互质的, 我脑子是抽了吗? 随便瞎d ...
- Codeforces 148D Bag of mice 概率dp(水
题目链接:http://codeforces.com/problemset/problem/148/D 题意: 原来袋子里有w仅仅白鼠和b仅仅黑鼠 龙和王妃轮流从袋子里抓老鼠. 谁先抓到白色老师谁就赢 ...
- CodeForces 148D-Bag of mice(概率dp)
题意: 袋子里有w个白球b个黑球,现在两个人轮流每次取一个球(不放回),先取到白球的获胜,当后手取走一个球时,袋子里的球会随机的漏掉一个,问先手获胜的概率. 分析: dp[i][j]表示袋子中i个白球 ...
随机推荐
- dubbo-springboot入门级demo
1. dubbo-springboot入门级demo 1.1. 前言 最后一个做运维的朋友和我提起,他们公司想做个dubbo灰度发布的功能,而这个功能落到了他头上.在我的印象里,dubbo应该可以通过 ...
- 以前的博客内容迁至CSDN,博客名不变,以后博客将在两个平台同步更新
为了更好的利用博客园和csdn这两个博客家园,今天把博客园中的内容迁至csdn,博客名称还是使用cooldream2009,以后的文章将同步在博客园和csdn发表,特此声明.
- springboot~@Query到DTO对象
我们有时在进行开发过程中,使用jpa的@Query注解去选择多张表然后返回一个DTO对象,这个时候我们需要特殊处理一下,因为默认情况下,你的jpa代码是不认DTO对象的. 参考文章:https://s ...
- docker-compose-volumes的说明
docker-compose里两种设置方式都是可以持久化的 绝对路径的 ghost: image: ghost volumes: - ./ghost/config.js:/var/lib/ghost/ ...
- window.localStorage的用法
一.什么是localStorage.sessionStorage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题 ...
- Windows Server 2012 R2安装SqlServer 2016
1.系统安装 微软操作系统 Windows Server 2012 R2 官方原版镜像 Windows Server 2012 R2 是由微软公司(Microsoft)设计开发的新一代的服务器专属操作 ...
- 推荐一款好用的任务定时器:Quartz
前言 官网:https://www.quartz-scheduler.net/ 一款开源的任务定时器. 日常有很多地方需要定时刷新的,比如微信开发中的微信API token,或者定时清理一下缓存数据等 ...
- .NetCore WebAPI采坑之路(持续更新)
1.WebAPI新增日志过滤器or中间件后Action读取到的请求Body为空问题 案例: 自定义了一个中间件,用于记录每次访问webapi的入参,以及引用了Swagger. 先看下面这段代码: pu ...
- ASP.NET Core 基于JWT的认证(一)
ASP.NET Core 基于JWT的认证(一) Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计 ...
- dotnet检测类型是否为泛型
private static string GetTableName(Type type) { //检测类型是否为泛型 if (type.GetType().IsGenericType) {//取出泛 ...