我有一个不一样的推式子方法。
先将问题转换一下,假设当前的 gcd $x=p1^{k1}p2^{k2}\cdots$,即为求:
不妨将每个质数 $p$ 看成一个物品,
假设 $x$ 是新插入集合的数,不妨将 $x$ 看成一个这样的操作:
现在问题转化成了一个取物品的的问题,即为求:
那么直接 Min-max 容斥:
考虑当 $\prod_{x\in T}x>n$ 时 $P(T)=1$,且 $x$ 为质数,于是可以将式子改写:
然后问题就解决了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| int qmod(int x,int y) { int ans=1; while(y) { if(y&1)(ans*=x)%=M; (x*=x)%=M; y>>=1; } return ans; } signed main() { n=read(); int inv=qmod(n,M-2); for(rg int i=2;i<=n;i++) { if(!vis[i])p[++len]=i,u[i]=1; for(rg int j=1;j<=len&&p[j]*i<=n;j++) { vis[i*p[j]]=1; if(i%p[j]==0)break; u[i*p[j]]=-u[i]; } sum=(sum-u[i]+M)%M; } for(rg int i=2;i<=n;i++) { if(u[i]==0)continue; mul[i]=n*qmod(n-n/i,M-2); sum=(sum+u[i]*mul[i]%M+M)%M; } write((sum+1)%M); }
|