您的位置:首页 > 其它

HDU - 4135Co-prime 容斥 分解质因子

2017-07-24 10:26 176 查看

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: