大意:求a-b中与n互质的个数。
using namespace std;
typedef long long ll;
ll prime[70];
ll m,n;
void get_prime()
{
for(ll i=2;i*i<=n;i++)
if(n&&n%i==0) //对n进行素因数分解
{
prime[m++]=i;
while(n&&n%i==0) n/=i;
}
if(n>1) prime[m++]=n;
}
ll solve(ll num)
{
ll i,j;
ll ans=0,tem,flag;
for(i=1;i<1<<m;i++)
{
tem=1,flag=0;
for(j=0;j<m;j++)
if(i&1<<j)
flag++,tem*=prime[j];
if(flag&1) ans+=num/tem; //容斥原理,奇加偶减
else ans-=num/tem;
}
return ans;
}
int main()
{
ll t,a,b,k=1;
cin>>t;
while(t--)
{
m=0;
scanf("%I64d%I64d%I64d",&a,&b,&n);
get_prime();
printf("Case #%I64d: %I64d\n",k++,b-solve(b)-(a-1-solve(a-1)));
}
return 0;
}
本文介绍了一种算法,用于计算区间[a-b]内与给定整数n互质的整数数量。通过先对n进行素因数分解,再运用容斥原理,实现了高效的求解过程。

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



