您的位置:首页 > 其它

hdu4135(容斥原理)Co-prime

2017-07-23 10:58 387 查看
题目大意是:输入A,B,N,求[A,B]区间内与N互质的数的个数 

#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
long long a,b;
int k;
vector<int> x;
void getprime(int n)
{
x.clear();
for(int i=2; i*i<=n; ++i)
if(n%i==0)
{
x.push_back(i);
n/=i;
while(n%i==0) n/=i;
}
if(n!=1) x.push_back(n);//这个需要注意
}
long long solve(long long n,long long b)
{
//求n和区间[1,b]
long long ans=b;
for(int i=1; i<(1<<x.size()); ++i)
{
int cnt=0,k=1;
for(int j=0; j<x.size(); ++j)
if(i&(1<<j))
++cnt,k*=x[j];
if(cnt&1) ans-=b/k;
else ans+=b/k;
}
return ans;
}
int main()
{
int T;
scanf("%d",&T);
for(int kase=1; kase<=T; ++kase)
{
cin>>a>>b>>k;
if(!k)
{
printf("Case %d: 0\n",kase);
continue;
}
getprime(k);
printf("Case #%d: %lld\n",kase,solve(k,b)-solve(k,a-1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: