《组合数学》里面的容斥原理,写的。。太乱了啊,
下面是关于容斥原理的详细介绍链接:http://www.cppblog.com/vici/archive/2011/09/05/155103.html
自己理解个粗浅的意思,容斥原理其实就是概率论里面的加法公式的n项延伸,
对于集合Ai有以下原理公式,
原理的意思就是:
要计算n个集合并集的大小,先计算所有单个集合的大小,再减去所有两个集合相交的部分,再加回所有三个集合相交的部分,再减去所有四个集合相交的部分,依此类推,直到计算完所有集合相交的部分。
——奇加偶减
模板:
vector<int> v; ll solve(int l,int r,int n) //[l,r]内与n互素的数字个数 { v.clear(); //筛选素数 for(int i=2;i*i<=n;i++) { if(n%i==0) { v.push_back(i); while(n%i==0) n/=i; } } if(n>1) v.push_back(n); //容斥原理的二进制解法 int len=v.size(); ll res=0; for(int i=1;i<(1<<len);i++) { int cnt=0; ll val=1; for(int j=0;j<len;j++) { if(i&(1<<j)) { cnt++; val*=v[j]; } } if(cnt&1) //若为奇数项进行加法,偶数项进行减法 res+=r/val-(l-1)/val; else res-=r/val-(l-1)/val; } return r-l+1-res; }