前言
萌新做了下 CF1750 D  发现自己对容斥的理解完全不深入
容斥,顾名思义,就是分别算每个的贡献,然后减去重复的贡献。
我们考虑容斥的应用。
应用
求 [1,m] 满足 gcd(x,n)=1 的个数
显然,我们考虑唯一分解定理, n=p1k1∗p2k2∗p3k3∗...∗pnkn
我们考虑 ki>0 的情况
换句话说 n 不能是 pi 的倍数,这显然就是一个容斥原理。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 
 | mmp=tmp;tmp=a[i];
 int sz=0,d[30]={0};
 for(int j=1;p[j]*p[j]<=mmp;j++)
 {
 if(mmp%p[j]==0)
 {
 d[++sz]=p[j],mmp/=p[j];
 while(mmp%p[j]==0) mmp/=p[j];
 }
 }
 if(mmp>1) d[++sz]=mmp;
 int aans=0;
 for(int s=1;s<=(1<<sz)-1;s++)
 {
 int lk=1;
 int cc=0;
 for(int j=1;j<=sz;j++)
 {
 if(1<<(j-1)&s) lk*=d[j],cc++;
 }
 aans+=(m-m/lk)*((cc&1)?1:-1);
 }
 ans=(1ll*ans*aans)%modp;
 
 |