https://vjudge.net/problem/HDU-4135
掌握质因数分解和容斥原理的应用
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=10056;
const int maxn=1;
ll a,b;
int n;
int num;
ll fen[100];
ll gcd(ll a,ll b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
ll ge(ll x)
{
ll sum=0;
for(int i=1;i<(1<<num);i++)
{
ll lcm=1;int k=0;
for(int j=0;j<num;j++)
{
if(i&(1<<j))
{
k++;
lcm=fen[j]*lcm/gcd(fen[j],lcm);
}
}
if(k&1)
sum=sum+x/lcm;
else
sum=sum-x/lcm;
}
return sum;
}
int main()
{
int t;
scanf("%d",&t);
int qqq=1;
while(t--)
{
scanf("%I64d %I64d %d",&a,&b,&n);
int tag=1;
int s=sqrt(n);
num=0;
for(int i=2;i<=n;i++)//质因数分解
{
if(n%i==0)
{
fen[num++]=i;
while(n%i==0)
n=n/i;
tag=0;
}
if(i>s&&tag)
{
fen[num++]=n;
break;
}
}
ll s1=ge(b);
ll s2=ge(a-1);
//cout<<s1<<" "<<s2<<" "<<endl;
ll ans=(b-a+1)-(s1-s2);
printf("Case #%d: %I64d\n",qqq++,ans);
}
return 0;
}