poj 2773 欧几里得 一个拓展应用

来源:互联网 发布:淘宝怎么看订单号 编辑:程序博客网 时间:2024/05/17 06:13

题目大意就是给出n和k求出第k个与n互素的数这里涉及到了 欧几里得的一个重要知识点:如果(a, b)互质的话,那么(b*t+a, b)肯定互质,其中t为正整数!那么这就是以循环周期的了那么这题就可以利用这个来做了,代码和详解如下:#include <iostream>#include <cstdio>#include <cstring>#include <string>using namespace std;const int maxn=1000005;int a[maxn];int gcd(int a,int b)//递归的欧几里得{    return b==0 ? a : gcd(b,a%b);}int main(){    int i;    int m,k;    while(scanf("%d%d",&m,&k)==2)    {        int j=0;        for(int i=1; i<=m; i++)        {            if(gcd(i,m)==1)//这里求出从1 ~ m之间与m互质的数            {               a[j++]=i;            }        }        if(k%j!=0)//这里要分开来考虑        {            printf("%d\n",k/j*m+a[k%j-1]);//这里k/j等于t,而且这数组的下标都是从0开始的        }        else if(k%j==0)        {            printf("%d\n",(k/j-1)*m+a[j-1]);        }    }    return 0;}


原创粉丝点击