题目链接
前置推论:
1.长度为1的序列只可能是一个1。
2.假设当前的序列长度为 k + 1 k+1 k+1,且前 k k k个数的 g c d = a gcd=a gcd=a不为1的话,那么第 k + 1 k+1 k+1位的数必然与a互质,所以第 k + 1 k+1 k+1个数选择的方案为[1,m]中与a互质的数的个数,记 g e t ( a ) get(a) get(a)为 [ 1 , m ] [1,m] [1,m]中与a互质的数的个数, g e t ( x ) get(x) get(x)可以通过容斥计算。
那么我们需要统计的就是所有长度>=2的期望。
我们从大到小遍历 [ 1 , m ] [1,m] [1,m],设当前枚举到的数为x,我们计算所有长度为 i + 1 ≥ 2 i+1\geq2 i+1≥2且序列的前i项的 g c d gcd gcd为x的期望,那么可以前i项必然都是x的倍数,显然通过求和我们可以得到一个较大的答案

∑ i = 1 ∞ ⌊ m x ⌋ i g e t ( x ) m ( i + 1 ) \sum_{i=1}^{\infty}\lfloor\frac{m}{x}\rfloor^i\frac{get(x)}{m}(i+1) i=1∑∞​⌊xm​⌋imget(x)​(i+1)
其中 g e t ( x ) m \frac{get(x)}{m} mget(x)​为常数项可以拎出来单独计算,那么后面的 ∑ i = 1 ∞ ⌊ m x ⌋ i ( i + 1 ) \sum_{i=1}^{\infty}\lfloor\frac{m}{x}\rfloor^i(i+1) ∑i=1∞​⌊xm​⌋i(i+1)就是我们要求的,这样求和的东西就是高中常说的错位相减法搞一下就能算出来了。
但是为什么说这个答案较大呢?仔细想一下,这样生成的序列的前i项的gcd必然包含所有x的倍数。
设 P ( d x , d y ) P(dx,dy) P(dx,dy)为序列长度为dx且gcd为dy的概率
那么后半部分真正的答案就是

∑ i = 1 ∞ ( ⌊ m x ⌋ i − ∑ j = i + 1 m P ( i , j ) [ j % i = 0 ] ) ( i + 1 ) = ∑ i = 1 ∞ ⌊ m x ⌋ i ( i + 1 ) − ∑ j = x + 1 m ∑ i = 1 ∞ P ( i , j ) ( i + 1 ) [ j m o d x = 0 ] \sum_{i=1}^{\infty}(\lfloor\frac{m}{x}\rfloor^i-\sum_{j=i+1}^mP(i,j)[j\%i=0])(i+1)= \sum_{i=1}^\infty\lfloor\frac{m}{x}\rfloor^i(i+1)-\sum_{j=x+1}^m\sum_{i=1}^\infty P(i,j)(i+1)[j\mod x=0] i=1∑∞​(⌊xm​⌋i−j=i+1∑m​P(i,j)[j%i=0])(i+1)=i=1∑∞​⌊xm​⌋i(i+1)−j=x+1∑m​i=1∑∞​P(i,j)(i+1)[jmodx=0]
我们设 a n [ c ] = ∑ i = 1 ∞ P ( i , c ) ( i + 1 ) an[c]=\sum_{i=1}^{\infty}P(i,c)(i+1) an[c]=∑i=1∞​P(i,c)(i+1),那么 a n [ x ] = ∑ i = 1 ∞ ⌊ m x ⌋ i ( i + 1 ) − ∑ j = i + 1 m a n [ j ] [ j % i = 0 ] an[x]=\sum_{i=1}^{\infty}\lfloor\frac{m}{x}\rfloor^i(i+1)-\sum_{j=i+1}^man[j][j\% i=0] an[x]=∑i=1∞​⌊xm​⌋i(i+1)−∑j=i+1m​an[j][j%i=0],那么长度为i+1项且前i项的gcd为x的真正期望就是 a n [ x ] g e t ( x ) m an[x]\frac{get(x)}{m} an[x]mget(x)​。
综上,对每个数进行讨论并计算答案即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
#define fi first
#define se second
#define pb push_back
LL m;
const LL mod=1e9+7;
LL pm(LL x,LL y){LL z=1;while(y){if(y&1)z=z*x%mod;x=x*x%mod;y>>=1;}return z;
}
int a[N],p[N],cnt;
void P(){for(int i=2;i<N;i++){if(!p[i])a[++cnt]=i;for(int j=1;j<=cnt&&1ll*a[j]*i<N;j++){p[a[j]*i]=1;if(i%a[j]==0)break;}}
}
LL get(int y){vector<int>x;for(int i=1;i<=cnt&&1ll*a[i]*a[i]<=y;i++){if(y%a[i]==0){x.pb(a[i]);while(y%a[i]==0)y/=a[i];}}if(y>1)x.pb(y);int sz=x.size();int ans=m;for(int i=1;i<1<<sz;i++){int l=0,r=1;for(int j=0;j<sz;j++){if(1<<j&i){l++;r*=x[j];}}if(l&1)ans-=m/r;else ans+=m/r;}return ans;
}
LL _get(LL x){return (x*(m-x)+x*m)%mod*pm(1ll*(m-x)*(m-x)%mod,mod-2)%mod;
}
LL an[N];
int main() {ios::sync_with_stdio(false);cin>>m;P();LL re_m=pm(m,mod-2);LL ans=re_m;for(int i=m;i>=2;i--){LL x=get(i);LL res=_get(m/i)%mod;for(int j=i+i;j<=m;j+=i)res-=an[j],res=(res+mod)%mod;an[i]=res;ans+=res*x%mod*re_m%mod;ans%=mod;}cout<<ans<<'\n';return 0;
}

【每日一题】Steps to One (容斥+错位相减)cf1139D相关推荐

  1. 高中数学数列错位相减压轴大题_错位相减法秒杀公式

    错位相减法在数列求和部分属于高频考点,同学们大都会用,但是对结果总有些不确定.我们知道,等比数列前项和公式的推导方法用的是"错位相减法".在近几年的高考中,涉及到错位相减法的试题有 ...

  2. hdu 5317 RGCDQ (2015多校第三场第2题)素数打表+前缀和相减求后缀(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5317 题意:F(x) 表示x的不同质因子的个数结果是求L,R区间中最大的gcd( F(i) , F(j ...

  3. 玲珑杯 1138 - 震惊,99%+的中国人都会算错的问题(容斥)

    题目链接:http://www.ifrog.cc/acm/problem/1138 题解:这题就是简单的容斥,但是和标准的不太一样,这个是只加上出现奇数的.其实也是挺简单的. 容斥原式:      只 ...

  4. HDU - 5468 Puzzled Elena (容斥/莫比乌斯)

    做了好几个容斥了,一直找不到feel,这个做完在现在有一点感觉了.虽然刚开始也不会.但就是发现感觉不一样了. 首先,不考虑树的关系,单纯给出一个m,还有一个集合(里面数字任意),求集合里面跟m互质的数 ...

  5. 【笔记】郑州大学ACM实验室寒假新生培训之 排列组合与容斥

    >>b站视频链接<< 目录: OP 组合数和排列数 组合数与杨辉三角 Lucas定理 容斥原理 错位排序 m球n盒问题 多重集的r-组合数 ED OP \ 组合数和排列数 对于 ...

  6. [杂题训练]CF1228E Another Filling the Grid(容斥),CF936C Lock Puzzle(构造)

    文章目录 T1:CF1228E Another Filling the Grid solution code T2:CF936C Lock Puzzle solution code T1:CF1228 ...

  7. 51nod1667-概率好题【容斥,组合数学】

    正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1667 题目大意 两个人. 第一个人有k1k_1k1​个集合,第iii个包 ...

  8. 【POJ - 1741】Tree(树分治,容斥,点分治,模板题)

    题干: Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist ...

  9. 吉首大学新星杯L题 小李子的老年生活【容斥好题(只是问题比较裸)】

    传送门 // 题意就是给定一个n, 求1 - n 中与n互质的数的平方和. // 思路: 问题我们可以进行转换, 就是我们得到1 - n的所有数的平方和, 然后我们要做的就是减去n的素数因子(不是素数 ...

最新文章

  1. objective-c系列-单例
  2. 年轻人不讲武德,where 1=1 是什么鬼?
  3. 集合的hashCode方法的最佳实现
  4. html标签思维导图
  5. c语言改u3d游戏,使用Unity3D怎么制作一个五子棋游戏
  6. BufferedInputStream学习笔记
  7. LeetCode 670. 最大交换
  8. 武汉计算机应用中职学校,武汉市中职学校计算机应用基础课程抽考.Doc
  9. 利用C++Builder自定义Windows窗体“系统菜单”
  10. 58. web 攻击技术(2)
  11. 深度图补全-depth inpainting
  12. 浅谈TPM设备管理系统、推行要素和目的
  13. 通常网站当中的关键词密度如何控制呢
  14. Unity Kinect体感跑酷互动游戏方案
  15. linux limits.conf 生效,linux修改limits.conf不生效
  16. 工行智能客服服务量突破1.7亿笔;迪拜机场拟用人脸识别技术替代护照检查
  17. 全国应用计算机水平考试,全国计算机应用水平考试
  18. Oracle---查询
  19. stable-baselines3学习之Logger
  20. 用计算机用语说唯美的话,古风说说唯美句子

热门文章

  1. Consul安装使用
  2. 在诗和远方中感受别样科技魅力,一次带上英得尔车载冰箱的自驾之旅!
  3. python strftime模块_python datetime模块用strftime 格式化时间
  4. 以程序员的名义,分析 “人民的名义”
  5. jzoj5167. 下蛋爷(AC自动机)
  6. 苹果母座解码芯片、Lightning苹果母座解码I.C
  7. mysql ormlite_ORMLite
  8. 使用DaemonSet定制AKS工作节点
  9. 找找org.springframework.web.servlet.view.InternalResourceViewResolver
  10. java 带横杠或下划线_的数据库字段变驼峰,比如ID_CARD_INFO_TITLE转换成idCardInfoTitle