POJ 2773 Happy 2006

原创 2013年12月04日 20:14:55

二分 + 容斥原理

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;


const int MAXN = 1000005;
const int inf  = 0x3f3f3f3f;
typedef long long ll;
bool is_prime[MAXN];
ll   prime[MAXN];
ll   factor[110], ans;
int  len, pcnt;
inline ll min(ll a, ll b) {
    return a < b ? a : b;
}
inline ll max(ll a, ll b) {
    return a > b ? a : b;
}
void Init() {
    int i, j;
    len = 0;
    memset(is_prime, true, sizeof(is_prime));
    is_prime[0] = is_prime[1] = false;
    prime[len++] = 2;
    for(i = 4; i < MAXN; i += 2)
        is_prime[i] = false;
    for(i = 3; i * i <= MAXN; i += 2) {
        if(is_prime[i]) {
            prime[len++] = i;
            for(j = i * i; j < MAXN; j += i)
                is_prime[j] = false;
        }
    }
    for( ; i < MAXN; i += 2)
        if(is_prime[i])
            prime[len++] = i;
    return ;
}
void cal_factor(ll n) {
    pcnt = 0;
    for(int i = 0; i < len && prime[i] * prime[i] <= n; ++i) {
        if(n % prime[i] == 0) {
            factor[pcnt++] = prime[i];
            while(n % prime[i] == 0)
                n /= prime[i];
        }
    }
    if(n > 1) factor[pcnt++] = n;
    return ;
}
void dfs(int id, ll cur, int cnt, ll limit) {
    if(id == pcnt) {
        if(cnt & 1)
            ans -= limit / cur;
        else
            ans += limit / cur;
        return ;
    }
    dfs(id + 1, cur, cnt, limit);
    dfs(id + 1, cur * factor[id], cnt + 1, limit);
    return ;
}
ll get_num(ll limit) {
    ans = 0;
    dfs(0, 1, 0, limit);
    return ans;
}
ll solve(ll m, ll k) {
    ll ret = inf;
    cal_factor(m);
    int low = 1, high = inf, mid;
    while(low <= high) {
        mid = (low + high) / 2;
        if(get_num(mid) >= k) {
            ret = min(ret, mid);
            high = mid - 1;
        }
        else {
            low = mid + 1;
        }
    }
    return ret;
}
int main() {
    //freopen("aa.in", "r", stdin);
    ll m, k;
    Init();
    while(cin >> m >> k) {
        cout << solve(m, k) << endl;
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ2773---Happy 2006(容斥+二分)

Description Two positive integers are said to be relatively prime to each other if the Great Common...

POJ2773-Happy 2006

Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8312   Acc...

POJ 2773 Happy 2006(容斥原理)

题意:给n和k,求与n互素的第k个数。 思路:二分+容斥原理。 #include #include #include #include #include #include #inclu...

nyoj 762第k个互质数 poj 2773Happy 2006

nyoj和poj题意一样,就是查找第k个互质数, nyoj应该用容斥原理+二分查找,这道题在poj很容易AC,本来poj时间限制就长,而且后台水,比如我自己写的代码在poj32ms,在nyoj就一直...

POJ 2773 Happy 2006 (公式法 or 二分容斥定理)

http://poj.org/problem?id=2773 首先看一个简单的方法: 若K 若K>phi(n),我们可以利用gcd(k'+λn,n)=gcd(k',n),将其转化为K ...

POJ 2773 Happy 2006 (容斥原理+二分)

题目:http://poj.org/problem?id=2773 和 http://acm.nyist.net/JudgeOnline/problem.php?pid=762 题意:求与n的互质的...

POJ 2773 Happy 2006 (容斥)

题目链接:http://poj.org/problem?id=2773 题        意:给你m,k;找出第k个与m互素的数时多少。 思        路:二分加容斥,二分枚举[1,2^64]...

poj 2773 Happy 2006

题目来源:http://poj.org/problem?id=2773 勉强过! #include #include #include using namespace std; type...

poj_2773_Happy 2006

Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 8465   Acc...

poj 2773 Happy 2006(欧拉函数应用)

http://poj.org/problem?id=2773 题意:输入n,k,求与n不互素的第k个数,k可能大于n。 思路:以n=6为例,与6互素的数有一定规律。{1,5},{7...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)