容斥原理的(二進位制思想和質因子分解+模板)
阿新 • • 發佈:2018-12-31
#include<iostream> #include<string> #include<cstdio> #include<algorithm> #include<cmath> #include<iomanip> #include<queue> #include<cstring> #include<map> #define LL long long using namespace std; LL t,n,m,p,a[100080]; LL cnt=0; map<LL,LL>vis; map<LL,LL>::iterator it; void prim(LL num) { cnt=0; for(LL i=2;i*i<=num;i++) { if(num%i==0) { a[cnt++]=i; while(num%i==0)num/=i; } } if(num!=1)a[cnt++]=num; } LL all(LL m) { LL ans=0;///非互質數之和 for(LL i=1; i<(1<<cnt); i++) { LL sum=1,num1=0,tmp=i; for(LL j=0; j<cnt; j++) { if(i&((LL)(1<<j)))//選第j個質因子;與i的二進位制的第j位比較,看是否為1,是則選中 { sum*=a[j];//相乘 cout<<i<<" "<<sum<<endl; num1++;//標誌變數計算i中1的個數,也就是質因數的個數 } } tmp=m/sum;//確定個數;表示能被m整除的個數; if(num1&1) ans+=tmp; else ans-=tmp;//奇加偶減; } return ans; } int main() { prim(12); all(12); cout<<all(12); }