题意:
t组数据,每组输入a,b,n
在a - b中找出有几个与n互质的
思路:
找出n的素数因子,假设它的素数因子a1,a2,a3
用ans1记录1 - ( a-1 )中与n不互质的个数(ans1 = (a-1)-a1的倍数-a2的倍数-a3的倍数+a1*a2的倍数+a1*a3的倍数+a2*a3的倍数-a1*a2*a3的倍数) ==> 不难发现奇数个用减,偶数个用加
用ans2记录1 - b中与n不互质的个数(计算方法同上)
那么结果就是ans2 - ans1
#include <iostream>
#include <cstdio>
using namespace std;
__int64 p[100050],q[100050];
int j=0;
void init(__int64 n)
{
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
while(n%i==0)
{
n/=i;
}
p[j++] = i;
}
}
if(n!=1) p[j++] = n;
}
__int64 mul(__int64 x)
{
int k=1;
q[0]=-1;
__int64 ans=0;
for(__int64 i=0;i<j;i++)
{
int li = k;
for(__int64 l=0;l<li;l++)
{
q[k++] = -1*q[l]*p[i];
}
}
for(__int64 i=1;i<k;i++)
ans = ans + x/q[i];
return ans;
}
int main()
{
int t;
cin>>t;
int cas = 1;
while(t--)
{
__int64 a,b,n;
cin>>a>>b>>n;
j=0;
init(n);
__int64 sum = b-mul(b)-(a-1)+mul(a-1);
printf("Case #%d: ",cas++);
cout<<sum<<endl;
}
return 0;
}