模板
void prime(ll n)
{
k=0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
Prime[k++]=i;
while(n%i==0)
n/=i;//这一步是把相同质因子除去,如12有两个2
}
}
if(n>1)
Prime[k++]=n;
}
ll Find(ll num)
{
ll ans=0,temp,flag;
for(ll i=1;i<(ll)(1<<k);i++)
{
temp=1;
flag=0;
for(ll j=0;j<=k;j++)
{
if(i&(ll)(1<<j))
{
flag++;
temp*=Prime[j];
}
}
//cout<<temp<<endl;
if(flag&1)
ans+=num/temp;
else
ans-=num/temp;//奇加偶减
}
return ans;
}
#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
#include<set>
using namespace std;
#define ll long long
#define maxn 1000010
ll a,b,n;
ll Prime[maxn];
int k;
void prime(ll n)
{
k=0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
{
Prime[k++]=i;
while(n%i==0)
n/=i;//这一步是把相同质因子除去,如12有两个2
}
}
if(n>1)
Prime[k++]=n;
}
ll Find(ll num)
{
ll ans=0,temp,flag;
for(ll i=1;i<(ll)(1<<k);i++)
{
temp=1;
flag=0;
for(ll j=0;j<=k;j++)
{
if(i&(ll)(1<<j))
{
flag++;
temp*=Prime[j];
}
}
//cout<<temp<<endl;
if(flag&1)
ans+=num/temp;
else
ans-=num/temp;//奇加偶减
}
return ans;
}
int main()
{
int t;
int flag=0;
cin>>t;
while(t--)
{
cin>>a>>b>>n;
prime(n);
cout<<"Case #"<<++flag<<": "<<b-a+1-Find(b)+Find(a-1)<<endl;
}
return 0;
}
参考链接:
https://blog.csdn.net/qq_36336399/article/details/76406320