Co-prime
Given a number N, you are asked to count the number of integers between A and B inclusive which are relatively prime to N.
Two integers are said to be co-prime or relatively prime if they have no common positive divisors other than 1 or, equivalently, if their greatest common divisor is 1. The number 1 is relatively prime to every integer.
Input
The first line on input contains T (0 < T <= 100) the number of test cases, each of the next T lines contains three integers A, B, N where (1 <= A <= B <= 10 15) and (1 <=N <= 10 9).
Output
For each test case, print the number of integers between A and B inclusive which are relatively prime to N. Follow the output format below.
Sample Input
2 1 10 2 3 15 5
Sample Output
Case #1: 5 Case #2: 10
Hint
In the first test case, the five integers in range [1,10] which are relatively prime to 2 are {1,3,5,7,9}.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[20];
int main()
{
int t;
cin>>t;
for(int i=1;i<=t;i++){
ll A,B,n;
ll sum=0;
scanf("%lld %lld %lld",&A,&B,&n);
int cnt=0;
for(int i=2;i*i<=n;i++){
if(n%i==0) a[++cnt]=i;
while(n%i==0){
n/=i;
}
}
if(n>1){
a[++cnt]=n;
}
for(int i=1;i<(1<<cnt);i++){
int cnt1=0;
ll sum1=1;
for(int j=0;j<cnt;j++){
if(1&(i>>j)){
cnt1++;
sum1*=a[j+1];//求一个集合的并集 有公约数2,3,5 3个集合的并集
}
}
if(cnt1&1){
sum+=B/sum1;
sum-=(A-1)/sum1;
}
else{
sum-=B/sum1;
sum+=(A-1)/sum1;
}
}
printf("Case #%d: %lld\n",i,(B-A+1)-sum);
}
return 0;
}
找一个数的质因数即可 一个大于1的自然数可分为质数的积找到A和B之间能整除n的质因子的部分然后容斥定理即可