HDU

来源:互联网 发布:json.parse解析不了 编辑:程序博客网 时间:2024/06/05 16:35

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;} 
原创粉丝点击