题意:
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;
}
本文详细介绍了如何通过素数因子分解的方法来计算在给定范围内与特定整数互质的元素数量。算法通过计算特定整数的素数因子,并利用这些因子来确定该范围内与之互质的元素个数,从而实现高效的计算过程。
1万+

被折叠的 条评论
为什么被折叠?



