POJ2773求互质数

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

题意:给两个数m,k,问与m互质的第k个数是多少?

关键:如果a,b,两个数互质,记为(a,b),那么(b*k+a,b),k为非负整数。由此能推出如果1到m之间有j个与m互质的数,那么m,2*m之间也有j个互质的数,依次类推.例:假设m为10,1到10之间有1,3,7,9四个数与10互质,那么在10到20之间也有4个数与10互质,并且能知道这四个数是10*1+1,10*1+3,10*1+7,10*1+9,依次类推。

所以有AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn =1000010;
int prime[maxn];
int gcd(int a,int b)
{
    int t;
    if(a<b){t=a;a=b;b=t;}
    while(b)
    {
        t=a%b;a=b;b=t;
    }
    return a;
}
int main()
{
    int m,k;
    while(scanf("%d%d",&m,&k)!=EOF)
    {
        int j=0;
        for(int i=1;i<=m;i++)
            if(gcd(m,i)==1)
                prime[++j]=i;
        if(k%j==0)
            printf("%d\n",m*(k/j-1)+prime[j]);
        else
            printf("%d\n",m*(k/j)+prime[k%j]);
    }
}

 

posted @ 2013-08-06 16:42  拼搏今朝 努力奋进  阅读(236)  评论(0)    收藏  举报