POJ2773 Happy 2006【容斥原理】

题目链接:

http://poj.org/problem?id=2773

题目大意:

给你两个整数N和K。找到第k个与N互素的数(互素的数从小到大排列)。当中

(1 <= m <= 1000000,1 <= K <= 100000000 )。

解题思路:

K非常大,直接从小到大枚举找出不现实,仅仅能二分答案。二分枚举[1。INF]范围内全部的数x,

找到1~x范围内与N互素的数个数。假设等于K,则就是结果。

然后考虑1~x范围内与N互素的数个数 = x - 1~x范围内与N不互素的数个数

1~x范围内与N不互素的数个数用简单的容斥定理来求就可以。

AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL __int64
using namespace std;
const LL INF = 0xfffffff0;

int Prime[1000010],ct,N;

void Divide()
{
    ct = 0;
    int n = N;
    for(int i = 2; i <= sqrt(n*1.0); ++i)
    {
        if(n % i == 0)
        {
            Prime[ct++] = i;
            while(n % i == 0)
                n /= i;
        }
    }
    if(n != 1)
        Prime[ct++] = n;
}

LL Solve(int n)
{
    LL ans = 0;
    for(int i = 1; i < (1 << ct); ++i)
    {
        LL odd = 0;
        LL tmp = 1;
        for(int j = 0; j < ct; ++j)
        {
            if((1 << j) & i)
            {
                odd++;
                tmp *= Prime[j];
            }
        }
        if(odd & 1)
            ans += n/tmp;
        else
            ans -= n/tmp;
    }
    return n - ans;
}

int main()
{
    int K;
    while(~scanf("%d%d",&N,&K))
    {
        Divide();
        LL Left = 1, Right = INF, Mid, tmp;
        while(Left < Right) //二分答案
        {
            Mid = (Left + Right) >> 1;
            tmp = Solve(Mid);
            if(tmp >= K)
                Right = Mid;
            else
                Left = Mid + 1;
        }
        printf("%I64d\n",Left);

    }

    return 0;
}
时间: 2024-11-03 22:42:42

POJ2773 Happy 2006【容斥原理】的相关文章

poj2773 Happy 2006

Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9987   Accepted: 3434 Description Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7, 9...are al

poj2773 Happy 2006(二分+容斥)

题目链接:点这里!!!! 题意: 给你两个整数m(1<=m<=1e6),k(1<=k<=1e8).求第k个与m互质的数是多少. 题解: 直接二分+容斥. 代码: #include<cstdio> #include<cstring> #include<iostream> #include<sstream> #include<algorithm> #include<vector> #include<bitse

[二分+容斥原理] poj 2773 Happy 2006

题目链接: http://poj.org/problem?id=2773 Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9131   Accepted: 3073 Description Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1.

POJ 2773 Happy 2006#素数筛选+容斥原理+二分

http://poj.org/problem?id=2773 说实话这道题..一点都不Happy好吗 似乎还可以用欧拉函数来解这道题,但正好刚学了容斥原理和二分,就用这个解法吧. 题解:要求输出[1,m]中与m互质的第k个数,先打表,找到m的所有质因数,然后用二分实现,最开始区间为[1,2^60],利用容斥原理去找区间[1,mid]内素数的个数t,不断进行二分,直到所查找的区间[l,r]内素数的个数t等于k,mid=l=r,则此时的l就是第k个与m互质的数. #include<iostream>

【poj2773】Happy 2006 欧几里德

题目描述: 分析: 根据欧几里德,我们有gcd(b×t+a,b)=gcd(a,b) 则如果a与b互质,则b×t+a与b也一定互质,如果a与b不互质,则b×t+a与b也一定不互质. 所以与m互质的数对m取模具有周期性,则根据这个方法我们就可以很快的求出第k个与m互质的数. 假设小于m的数且与m互质的数有l个,其中第i个是ai,则第k*l+i个与m互质的数是k*m+ai. 所以,我就for一遍求出所有m以内的与m互质的数,然后根据周期性求解.(感觉有点暴力对吧) 代码如下,很短的: 1 #inclu

【poj2773】 Happy 2006

http://poj.org/problem?id=2773 (题目链接) 题意:给出两个数m,k,要求求出从1开始与m互质的第k个数. Solution 数据范围很大,直接模拟显然是不行的,我们需要用到一些奇奇怪怪的方法. 考虑是否可以通过某些途径快速得到解,然而并没有头绪.正难则反,能不能通过计算不与m互质的数的个数来得到互质的数的个数呢?答案是可行的,我们可以运用容斥. 二分一个答案mid,容斥统计出在区间[1,mid]中是m的质因子的倍数的数的个数ans,然后我们可以用mid-ans得到

Poj2773容斥原理

题意:求第k个与m互质的数. 容斥原理求出[1,L]与m互质的数,然后二分k即可. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<iostream> #include<string> #include<queue> #include<stack> #include<list> #include<stdlib.h> #include<algorit

POJ 2773 Happy 2006【容斥原理】

题目链接: http://poj.org/problem?id=2773 题目大意: 给你两个整数N和K,找到第k个与N互素的数(互素的数从小到大排列),其中 (1 <= m <= 1000000,1 <= K <= 100000000 ). 解题思路: K很大,直接从小到大枚举找出不现实,只能二分答案.二分枚举[1,INF]范围内所有的数x, 找到1~x范围内与N互素的数个数,如果等于K,则就是结果. 然后考虑1~x范围内与N互素的数个数 = x - 1~x范围内与N不互素的数个

poj 2773(容斥原理)

容斥原理入门题吧. Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9798   Accepted: 3341 Description Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7,