码迷,mamicode.com
首页 > 其他好文 > 详细

HDU4135 Co-prime 容斥原理

时间:2020-04-01 21:02:50      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:ack   ima   vector   typedef   cos   mamicode   random   max   mod   

第一做容斥原理,开始真的不太好理解 

技术图片

题意:给出a,b<=1e19  n<=1e9 ,问[a,b]中与n互质的个数

考虑[a,b]中与n不互质的个数,对n唯一分解定理,与n不互质的个数即为n/p,但是考虑到会有重复,且若数字个数是奇数则要+,偶数减去,因此借助二进制遍历每一种情况(极其神奇的思想)

代码值得好好思考

#pragma warning(disable:4996)

#include<iostream>
#include<unordered_map>
#include<algorithm>
#include<string>
#include<cmath>
#include<cstring>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<deque>
#include<stack>
#include<sstream>
#include <cstdlib>
#include<cstdio>
#include<random>
#define INF 0x3f3f3f3f
#define eps 1e-8
#define equals(a,b) (fabs(a-b)<eps)
#define MOD 100000007
std::mt19937 rnd(233);
//#define rnd() rand()%1000
const int maxn = 1e7+5 ;
const double PI = acos(-1.0);
typedef long long ll;
using namespace std;


ll p[maxn];
int cnt;
ll n;

void init(ll m) {
    for (int i = 2; i * i <= m; i++) {
        if (m % i == 0) {
            p[cnt++] = i;
            while (m % i == 0) m /= i;
        }
    }
    if (m > 1) p[cnt++] = m;
}

ll solve(ll x) {
    ll len = 1ll << cnt;
    ll ans = 0;
    for (ll i = 1; i < len; i++) {
        int f = 0;
        ll tmp = 1;
        for (ll j = 0; j < cnt; j++) {
            if (i & (1ll << j)) {
                f++;
                tmp *= p[j];
            }
        }
        if (f & 1) ans += x / tmp;
        else ans -= x/ tmp;
    }
    return ans;
}

int main() {
    int T;
    ll a, b;
    scanf("%d", &T);
    int kase = 1;
    while (T--) {
        cnt = 0;
        scanf("%lld%lld%lld", &a, &b, &n);
        init(n);
        printf("Case #%d: %lld\n", kase++, (b - a + 1) - (solve(b) - solve(a - 1)));
    }
    return 0;
}

 

HDU4135 Co-prime 容斥原理

标签:ack   ima   vector   typedef   cos   mamicode   random   max   mod   

原文地址:https://www.cnblogs.com/hznumqf/p/12615665.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!