題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4135
題目大意:計算給定區間與互質的數的個數。
思路:簡單容斥裸題。
AC代碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a,b,n;
vector<ll>prime;
void solve(ll n)
{
for(ll i=2;i*i<=n;i++){
if(n%i==0){
prime.push_back(i);
while(n%i==0){
n/=i;
}
}
}
if(n>1){
prime.push_back(n);
}
}
ll cal(ll r)
{
ll ans=0;
for(ll i=1;i<(1<<prime.size());i++){
ll mul=1,cnt=0;
for(int j=0;j<prime.size();j++){
if(i&(1<<j)){
cnt++;
mul*=prime[j];
}
}
mul=r/mul;
if(cnt&1){
ans+=mul;
}
else{
ans-=mul;
}
}
return r-ans;
}
int main()
{
int t;
cin>>t;
int Case=0;
while(t--){
cin>>a>>b>>n;
prime.clear();
solve(n);
cout<<"Case #"<<++Case<<": ";
cout<<cal(b)-cal(a-1)<<endl;
}
return 0;
}