题意:求a到b之间与k互质的个数
思路:容斥原理
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
const int qq = 10005;
int num;
int prime[qq];
void Analyze(ll x){
for(ll i=2; i*i<=x; ++i)
if(x%i==0){
prime[num++] = i;
while(x%i==0) x/=i;
}
if(x>1) prime[num++] = x;
}
ll slove(ll x){
ll ans = 0;
for(ll i = 1; i<(1<<num); ++i){
ll t = 1;
int cnt = 0;
for(int j=0; j<num; ++j)
if(i&(1<<j))
cnt++,t*=prime[j];
if(cnt&1) ans+=x/t;
else ans-=x/t;
}
return ans;
}
int main(){
int t;scanf("%d", &t);
int p=1;
while(t--){
ll n,m,k;scanf("%lld%lld%lld",&n, &m, &k);
num = 0;
Analyze(k);
printf("Case #%d: ", p++);
printf("%lld\n", m-slove(m)+slove(n-1)-(n-1));
}
return 0;
}