先推荐一篇博客: 容斥原理详解
应用:
一:概率论是容斥原理的直接表现,代代公式就可以了。
二:与排列组合结合,如:(0,1,2)序列问题,方程整数解问题。
三:求指定区间内与n互素的数的个数——区间互素数个数
下面部分代码:
求区间[1,r]中与n互素的数的个数
int vc(int n,int r){
int sum=0;
vector<int>p;
for(int i=2;i*i<=n;i++){
if(n%i==0){
p.push_back(i);
while(n%i==0) n/=i;
}
}
if(n>1) p.push_back(n);
for(int k=1;k<(1<<p.size());k++){
int t=1,j=0;
for(int i=0;i<p.size();i++){
if(k&(1<<i)){
j++;
t*=p[i];
}
}
int cur=r/t;
if(j&1) sum+=cur;
else sum-=cur;
}
return r-sum;
}