poj 2773欧几里得的应用

来源:互联网 发布:文本导入mysql 乱码 编辑:程序博客网 时间:2024/06/07 06:16

题目大意就是给出n和k求出第k个与n互素的数

如果知道欧几里德算法的话就应该知道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互素的数

假设小于m的数且与m互素的数有k个,其中第i个是ai,则第m×k+i与m互素的数是k×m+ai

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<vector>#include<algorithm>#include<map>using namespace std;const int maxn = 1000000 + 100;#define INF 0x3f3f3f3f#define clr(x,y) memset(x,y,sizeof x )typedef long long ll;#define eps 10e-10const int Mod = 1000000007;typedef pair<ll, ll> P;int gcd(int x,int y){    return y ? gcd(y,x % y) : x;}int ps[maxn];int main(){    int n,k;    while( ~ scanf("%d%d",&n,&k))    {        int len = 0;        for(int i = 1; i <= n; i ++)        {            if(gcd(n,i) == 1)                ps[len ++] = i;        }        if(k <= len)        {            printf("%d\n",ps[k - 1]);            continue;        }        int t = k / len,ts = k % len;        printf("%d\n",ts ? (t * n + ps[ts - 1]) : ((t - 1) * n + ps[len - 1]));    }    return 0;}


原创粉丝点击