【HDU 4135 Co-prime】容斥定理+質因數分解
阿新 • • 發佈:2018-12-09
HDU4135 題意 求A-B之間與N互質的數的個數 做法 我們首先對N分解質因數,再對其所有因子進行容斥,最後能得到所有與N不互質的數的個數,最後用n減去這個個數,就是與n互質的數的個數。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long ll;
vector<int> v;
ll cal(ll n,ll x)
{
ll ans=0;
v.clear();
for (ll i=2;i*i<=x;i++)
{
if(x%i==0)
{
v.push_back(i);
while(x%i==0) x/=i;
}
}
if(x>1) v.push_back(x);
int sz=v.size();
for(int i=0;i<(1<<sz);i++)
{
int num=0;
ll tmp=1;
for(int j=0;j<sz;j++)
{
if (i&(1<<j))
{
num++;
tmp*=v[j];
}
}
tmp=n/tmp;
if(num&1) ans-=tmp;
else ans+=tmp;
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
int cnt=1;
while(t--)
{
ll a,b,n;
scanf ("%lld%lld%lld",&a,&b,&n);
ll ans=cal(b,n)-cal(a-1,n);
printf("Case #%d: %lld\n",cnt++,ans);
}
return 0;
}