挺忙的,改天回来再写题解
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
#include <queue>
#include <map>
#include <cmath>
#include <vector>
using namespace std;
#define N 500010
#define pi acos(-1.0)
#define inf 0x3f3f3f3f
#define pb(x) push_back((x))
typedef long long ll;
typedef unsigned long long ull;
ll c;
vector <int> ans;
ll gan(ll a,ll x){
for(int i=2;i*i<=a;i++){
if(a%i==0){
ans.push_back(i);
while(a%i==0){
a/=i;
}
}
}
if(a>1) ans.push_back(a);
int s=ans.size();
ll sum=0;
for(int i=1;i<=(1<<s)-1;i++){
ll tmp=x;
int cnt=0;
for(int j=0;j<s;j++){
if(i&(1<<j)){
tmp/=ans[j];
cnt++;
}
}
if(cnt%2) sum+=tmp;
else sum-=tmp;
}
ans.clear();
return sum;
}
int main(){
ll a,b;
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++){
scanf("%lld%lld%lld",&a,&b,&c);
printf("%lld\n",b-a+1-gan(c,b)+gan(c,a-1));
}
return 0;
}