您的位置:首页 > 其它

[HDU 4135]Co-prime:容斥原理

2017-04-11 19:12 399 查看
点击这里查看原题

问题可以转化成求[1,x]中与n互质的数的个数,则答案为cal(1,b)-cal(1,a-1),现在的问题就是如何去求cal(1,x)

这个需要用到容斥原理,对n进行质因数分解,然后减去[1,x]中有含有一个质因数的数的个数,加上含有两个质因数的数的个数,减去三个……,以此类推,得到答案

/*
User:Small
Language:C++
Problem No.:4135
*/
#include<bits/stdc++.h>
#define ll long long
#define inf 999999999
using namespace std;
ll a,b,n,pri[1005];
int tot;
ll cal(ll x){
ll res=x;
for(ll i=1;i<((ll)1<<tot);i++){
int cnt=0;
ll tmp=1;
for(int j=0;j<tot;j++){
if((i>>j)&1){
cnt++;
tmp*=pri[j+1];
}
}
res+=x/tmp*(cnt%2?-1:1);
}
return res;
}
int main(){
freopen("data.in","r",stdin);//
int t;
cin>>t;
for(int i=1;i<=t;i++){
tot=0;
cin>>a>>b>>n;
for(ll j=2;j*j<=n;j++){
if(n%j==0){
pri[++tot]=j;
while(n%j==0) n/=j;
}
}
if(n!=1) pri[++tot]=n;
cout<<"Case #"<<i<<": "<<cal(b)-cal(a-1)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: