poj 2773 Happy 2006(求第k个与n互质的数)

原创 2013年12月04日 09:02:58
Happy 2006
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 8779   Accepted: 2913

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 all relatively prime to 2006.

Now your job is easy: for the given integer m, find the K-th element which is relatively prime to m when these elements are sorted in ascending order.

Input

The input contains multiple test cases. For each test case, it contains two integers m (1 <= m <= 1000000), K (1 <= K <= 100000000).

Output

Output the K-th element in a single line.

Sample Input

2006 1
2006 2
2006 3

Sample Output

1
3
5


题意:给出m、k,求k个与m互质的数。
思路:我们知道gcd(b×t+a,b)=gcd(a,b)  (t为任意整数),如果a与b互素,则b×t+a与b也一定互素,如果a与b不互素,则b×t+a与b也一定不互素。故与m互素的数对m取模具有周期性,则根据这个方法我们就可以很快的求出第k个与m互素的数。

AC代码:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <queue>
#include <ctime>

#define ll __int64

using namespace std;

const int maxn = 1000000;
int prime[maxn + 5];
bool vis[maxn + 5], flag[maxn + 5];
int cnt;
void getprime()
{
    memset(vis, false, sizeof(vis));
    cnt = 0;
    for(int i = 2; i <= maxn; i++)
        if(!vis[i])
        {
            prime[cnt++] = i;
            for(int j = 1; j * i<= maxn; j++)
                vis[j * i] = true;
        }
}

int euler(int n)
{
    memset(flag, false, sizeof(flag));
    int ret = n, m = n;
    for(int i = 0; prime[i] * prime[i] <= n; i++)
    if(n % prime[i] == 0)
    {
        ret = ret / prime[i] * (prime[i] - 1);
        while(n % prime[i] == 0) n /= prime[i];
        for(int j = prime[i]; j <= m; j += prime[i])
        flag[j] = true;
    }
    if(n > 1)
    {
        ret = ret / n * (n - 1);
        for(int j = n; j <= m; j += n)
        flag[j] = true;
    }
    return ret;
}
int find(int n, int id)
{
    int cnt = 0;
    for(int i = 1; i <= n; i++)
    {
        if(!flag[i]) cnt++;
        if(cnt == id) return i;
    }
    return -1;
}
int main()
{
    int m, k;
    getprime();
    while(cin>>m>>k)
    {
       if(m == 1)
       {
           cout<<k<<endl;
           continue;
       }
       int len = euler(m);
       cout<<((k - 1)/ len) * m + find(m, (k - 1) % len + 1)<<endl;
    }
    return 0;
}


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

相关文章推荐

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

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

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...

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的互质的...
  • w20810
  • w20810
  • 2015年02月20日 14:32
  • 337

POJ 2773 Happy 2006 (容斥)

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

poj2773 Happy 2006

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

POJ 2773 Happy 2006

优化优化再优化!

POJ 2773 Happy 2006 数学题

题目地址:http://poj.org/problem?id=2773 因为k可能大于m,利用gcd(m+k,m)=gcd(k,m)=gcd(m,k)的性质,最后可以转化为计算在[1,m]范...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2773 Happy 2006(求第k个与n互质的数)
举报原因:
原因补充:

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