Co-primeTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8179 Accepted Submission(s): 3255 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.
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 <= 1015) and (1 <=N <= 109).
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}.
Source The Third Lebanese Collegiate Programming Contest
Recommend lcy | We have carefully selected several similar problems for you: 1796 1434 3460 1502 4136 |
【题意】
求A到B之间与n互质的数的个数。
【解题思路】
容斥定理模板题。将问题转化为[1,B]区间内与n互质的个数-[1,A-1]区间内与n互质的个数。
之后再转化为num[1,B]-[1,B]之间与n有相同因子的数的个数-(num[1,A-1]-[1,A-1]之间与n有相同因子的数的个数)
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[1000],num;//a存质数
void init(LL n)//求一个数的质因子 (规定记住)
{
LL i;
num=0;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
a[num++]=i;
while(n%i==0)
n/=i;
}
}
if(n>1)a[num++]=n;
}
LL haha(LL m)//用队列数组实现容斥原理模板
{
LL que[10000],i,j,k,t=0,sum=0;
que[t++]=-1;
//循环相乘,容斥,减去多算的,再相加,用-1加减,k=t,判断与谁乘
for(i=0;i<num;i++)
{
k=t;
for(j=0;j<k;j++)
que[t++]=que[j]*a[i]*(-1);
}
for(i=1;i<t;i++)sum+=(m/que[i]);
return sum;
}
int main()
{
int t;scanf("%d",&t);
int v=1;
while(t--){
LL x,y,n,sum;
while(scanf("%lld%lld%lld",&x,&y,&n)!=EOF)
{
init(n);
sum=y-haha(y)-(x-1-haha(x-1));
//所有点的个数y减去1~y不与n互质的个数。
//再加上1~x里不与n互质的个数,再减去1~x所有点的个数
printf("Case #%d: %lld\n",v++,sum);
}
}
}