题目
题解
容斥原理简单解释:
解释完毕。
那么我们如何求这道题呢?
求[1,m]内与n互质的数的个数=m-[1,m]内与n不互质的个数(听起来就像废话,我一开始也是这么认为的,但是容斥原理就是求[1,m]内与n不互质的个数的)。
那么怎么求?首先举个例子
n除以奇数个数相乘的时候是加,n除以偶数个数相乘的时候是减。
就是这样,最后不懂就看代码吧!
代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
vector<LL>v;
LL k[1000];
LL solve(LL n)
{
for(LL i=2;i<=sqrt(n);i++)
{
if(n%i==0)
{
v.push_back(i);
while(n%i==0) n/=i;
}
}
if(n>1) v.push_back(n);
}
LL a,b,n;
LL cont(LL m)
{
LL sum=0,tot=0,flag;
k[tot++]=-1;
for(LL i=0;i<v.size();i++)
{
//printf(" %d\n",v[i]);
flag=tot;
for(int j=0;j<flag;j++)
k[tot++]=-1*k[j]*v[i];
}
for(LL i=1;i<tot;i++)
{
sum+=(m/k[i]);
}
return sum;
}
int main()
{
int t;
int tt=1;
scanf("%d",&t);
while(t--)
{
v.clear();
memset(k,0,sizeof(k));
scanf("%lld%lld%lld",&a,&b,&n);
solve(n);
printf("Case #%d: %lld\n",tt++,(b-cont(b))-(a-1-cont(a-1)));
}
return 0;
}