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.
2 1 10 2 3 15 5
Case #1: 5 Case #2: 10HintIn the first test case, the five integers in range [1,10] which are relatively prime to 2 are {1,3,5,7,9}.
本题是求[a,b]中与n互质的数的个数,可以转换成求[1,b]中与n互质的数个数减去[1,a-1]与n互质的数的个数。同时结合二进制;
如 2 3 5 7有 2^4-1 种表示;假设0 0 0 1 说明出现了7;类推此题;
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
#define ll long long
ll p[1000000];
ll sovle(ll num,int m)
{
ll ans=0,tmp,i,j,flag; //ans为不是素因子的倍数的数量;
for(i=1;i<(ll)(1<<m);i++) //选数;
{
tmp=1;//记录选中数字的乘积
flag=0; //选中数的数量;
for(j=0;j<m;j++)
if(i&((ll)(1<<j)))//检测第j个数有没有被选中;
{
flag++;
tmp*=p[j];
}
if(flag&1)//flag%2==1;表示奇数
ans+=num/tmp;
else
ans-=num/tmp;
}
return ans;
}
int main()
{
int T,t=0,m;
ll n,a,b,i,k;
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&a,&b,&n);
m=0;
for(i=2;i*i<=n;i++) //分解素因子;
if(n&&n%i==0)
{
p[m++]=i;
while(n&&n%i==0)
n/=i;
}
if(n>1)
p[m++]=n;
k=b-sovle(b,m)-(a-sovle(a-1,m))+1;
printf("Case #%d: %lld\n",++t,k);
}
return 0;
}