1. 程式人生 > >hdu 4135 容斥原理

hdu 4135 容斥原理

容斥中求指定區間內與n互素的數的個數問題,直接套模板solve(r)-solve(l-1)就是答案

#include<cstdio>
#include<cstring>
#include<vector>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define N 2300010
#define ll long long
const int maxn=30005;
const ll mod=1000000007;
ll solve (ll n, ll r) {
    vector<ll> p;
    for (ll i=2; i*i<=n; ++i)
        if (n % i == 0) {
            p.push_back (i);
            while (n % i == 0)
                n /= i;
        }
    if (n > 1)
        p.push_back (n);
    ll sum = 0;
    for (ll msk=1; msk<(1<<p.size()); ++msk) {
        ll mult = 1,
        bits = 0;
        for (ll i=0; i<(ll)p.size(); ++i)
            if (msk & (1<<i)) {
                ++bits;
                mult *= p[i];
            }
            ll cur = r / mult;
            if (bits % 2 == 1)
                sum += cur;
            else
                sum -= cur;
    }
    return r - sum;
}
int main(){
    int t,ca=1;
    ll a,b,n;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld",&a,&b,&n);
        printf("Case #%d: %lld\n",ca++,solve(n,b)-solve(n,a-1));
    }
    return 0;
}