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

解法是参考 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 ;
}

最新文章

  1. UBER的故事
  2. CSS 两列布局 之 左侧适应,右侧固定 3种方式
  3. eclipse/myeclipse下简单更改tomcat的启动等待时间
  4. django1.9 + uwsgi +nginx1.9 部署(centos6.6)
  5. [caffe]linux下安装caffe(无cuda)以及python接口
  6. PHP学习笔记 - 进阶篇(10)
  7. 【高级算法】模拟退火算法解决3SAT问题(C++实现)
  8. Mysql 记录
  9. 【项目笔记】【bug】数组空指针异常
  10. 基于JDK1.8的ArrayList剖析
  11. 《.NET 进阶指南》读书笔记1------NET程序集与普通EXE文件的区别
  12. 用原生js+canvas实现五子棋
  13. c++ 指针与const的三种组合
  14. laravel5.4+vue+element简单搭建(gulp+laravel Elixir)(转)
  15. hive的本地安装部署,元数据存储到mysql中
  16. 基本数据类型(dict)
  17. Android 编程下的 TraceView 简介及其案例实战
  18. 小结java自带的跟锁相关的一些类
  19. ArcGIS 10.2数字化线状要素时自己主动拼接成一条线
  20. SharpGL学习笔记(七) OpenGL的变换总结

热门文章

  1. shell位置参数的遍历
  2. 转载:tomcat过程原理
  3. 全栈开发React-私有路由
  4. VSCode中行数与代码之间用点点点代替
  5. 1.Configuration
  6. 【leetcode】989. Add to Array-Form of Integer
  7. shell读取文件第一行和最后一行,小数的运算比较
  8. PHP curl_multi_select函数
  9. apue 第4章 文件和目录
  10. js 常用功能实现(函数)