Co-prime
题目链接
题目大意
就是给你一个区间和一个数n,现在让你求这个区间内与n互质的所有数的个数。
题解
这题并不难,首先取出n的所有因子(n也要算进去,不要忘了),然后用容斥原理计算就行了。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long a,b,n,p[10005];
int T,h;
void prime(int n)
{
memset(p,0,sizeof(p));
h=0;
for (int i=2;i*i<=n;i++)
{
if (n%i==0) p[h++]=i;
while (n%i==0) n=n/i;
}
if (n>1) p[h++]=n;
}
long long solve(long long high)
{
long long t=1,sum=0;
int cnt=0;
for (long long i=1;i<(1<<h);i++)
{
cnt=0; t=1;
for (long long j=0;j<h;j++) if ((1<<j)&i)
{
cnt++;
t*=p[j];
}
if (cnt%2) sum+=high/t;
else sum-=high/t;
}
return high-sum;
}
int main()
{
int Case=1;
scanf("%d",&T);
while (T--)
{
scanf("%I64d%I64d%I64d",&a,&b,&n);
prime(n);
printf("Case #%d: %I64d\n",Case++,solve(b)-solve(a-1));
}
return 0;
}