1. 程式人生 > >【HDU 4135 Co-prime】容斥定理+質因數分解

【HDU 4135 Co-prime】容斥定理+質因數分解

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; }