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;
}


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

容斥原理 —— 求1~n有多少个数与k互质(二进制算法详细解释&模板)

这里有一道经典的例题,可以看一下:点击打开链接 这里的n可能要大于k的,所以不能用欧拉函数去做。 我们首先把k分解质因数,储存到p数组中,num表示质因子的数量。 void pr(int k) //...
  • wyg1997
  • wyg1997
  • 2016年07月22日 20:38
  • 1464

求1~n中与m互质的数的个数(m>n) 附hdu1695题解(欧拉函数+容斥原理)

int calc(int n,int m) { //求1~n 与m互质的数的个数 int num=getFactors(m); //先将m分解质因数 int sum=0; //先求...
  • qq547276542
  • qq547276542
  • 2015年11月08日 21:32
  • 3417

POJ 2773 Happy 2006(求第k个与m互素的数)

Description Two positive integers are said to be relatively prime to each other if the Great Common ...
  • AgoniAngel
  • AgoniAngel
  • 2016年04月16日 16:48
  • 337

POJ 2773:Happy 2006 - 第k大与n互素的数

题意:给出n和k求出第k个与n互素的数解法一:(效率较低 2235MS)如果知道欧几里德算法的话就应该知道gcd(b×t+a,b)=gcd(a,b)  (t为任意整数)则如果a与b互素,则b×t+a与...
  • Booky_Amnesia
  • Booky_Amnesia
  • 2015年01月10日 21:44
  • 394

HDU 4135 统计[a,b]这个区间中和n互质的数的个数 (容斥+数组队列) 好题

解题思路: 很明显的容斥问题,那么假如1-12,n=30; n里面的约数2,3,5,那么进行排列组合,2,3,5,-2*3,-2*5,-3*5,2*3*5 ,,,怎么表示,有两种方法,一种是状...
  • h1021456873
  • h1021456873
  • 2016年04月17日 21:38
  • 1141

经典问题:求区间内与n互素的数的个数(容斥原理)(4135)

Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S...
  • qq_33765907
  • qq_33765907
  • 2016年04月07日 16:21
  • 366

容斥原理应用(求1~r中有多少个数与n互素)

容斥原理应用(求1~r中有多少个数与n互素) 分类: 数论2013-08-02 20:15 121人阅读 评论(0) 收藏 举报 问题:求1~r中有多少个数与n互素。 ...
  • pi9nc
  • pi9nc
  • 2013年08月10日 19:29
  • 1483

容斥经典:求1-m中与n互素的数的个数(hdu4153)

hdu4153是一个很经典的容斥原理的题目,先贴一下链接:http://acm.hdu.edu.cn/showproblem.php?pid=4135 题意:求区间a-b内与n互素的数的个数 思路...
  • zhubing0331
  • zhubing0331
  • 2017年08月08日 13:42
  • 285

hdu1695—GCD(求两个区间内互质的数的对数)

题目链接:传送门 GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...
  • jiangzhiyuan123
  • jiangzhiyuan123
  • 2017年08月01日 10:19
  • 186

【容斥原理】【poj 2773】Happy 2006

http://poj.org/problem?id=2773 求第k大与n互质的数,二分+莫比乌斯水过 据说写dfs的容斥原理可以0ms 对此我表示hehe //#define _TEST _...
  • willinglive
  • willinglive
  • 2014年12月24日 10:40
  • 329
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 2773 Happy 2006(求第k个与n互质的数)
举报原因:
原因补充:

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