Description
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
题意
问【a,b】区间内与n互质的数的数目
题解:
容斥定理 + 分解质因子
AC代码
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
typedef long long LL;
using namespace std;
vector<LL > yinzi;
void fj(LL n){
yinzi.clear();
for (LL i = 2; i*i <= n; ++i){
if (n%i==0){
yinzi.push_back(i);
while (n%i==0) n/=i;
}
}
if (n>1) yinzi.push_back(n);
return ;
}
LL ronc(LL a,LL b){
LL res = 0;
for (LL i = a; i < yinzi.size(); ++i){
res += b/yinzi[i]-ronc(i+1,b/yinzi[i]);
}
return res;
}
int main(){
int t;
scanf("%d",&t);
int kase = 1;
while (t--){
LL a,b;
int n;
scanf("%lld%lld%d",&a,&b,&n);
fj(n);
LL ans = 0;
LL l = a-1 - ronc(0,a-1);/*注意不要把a漏了 不是a-1的话 如果a和n互质 那么答案就会少1*/
LL r = b - ronc(0,b);
ans = r-l;
/*
LL l = a - ronc(0,a);
LL r = b - ronc(0,b);
ans = r-l;
if (gcd(a,n)==1) ans+=1; //再加个gcd函数 此注释内可与上面的替换 道理都一样
*/
printf("Case #%d: %lld\n",kase++,ans);
}
return 0;
}