Problem 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.
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
思路:用a~b的长度减去1~10中与n不互素的个数(容斥定理)
代码如下:
#include<stdio.h>
#include<string.h>
long long p[1000];
int main()
{
long long a,b,c,d,k,t,n,m,s,x,cnt,sum;
scanf("%lld",&t);
for(int i=1;i<=t;i++)
{
scanf("%lld %lld %lld",&a,&b,&n);
cnt=0;
sum=b-a+1;
x=n;
for(int j=2;j*j<=x;j++)
{
if(x%j==0)
{
p[cnt++]=j;
while(x%j==0)
x=x/j;
}
}
if(x>1)
p[cnt++]=x;
for(long long j=1;j<(1<<cnt);j++)
{
long long s=1,l=0;
for(int k=0;k<cnt;k++)
{
if(j&(1<<k))
{
l++;
s=s*p[k];
}
}
s=b/s-(a-1)/s;
if(l%2)
sum=sum-s;
else
sum=sum+s;
}
printf("Case #%d: %lld\n",i,sum);
}
return 0;
}