【POJ2773】Happy 2006 欧几里德

题目描述:

 

分析:

根据欧几里德,我们有gcd(b×t+a,b)=gcd(a,b)

则如果a与b互质,则b×t+a与b也一定互质,如果a与b不互质,则b×t+a与b也一定不互质。

所以与m互质的数对m取模具有周期性,则根据这个方法我们就可以很快的求出第k个与m互质的数。

假设小于m的数且与m互质的数有l个,其中第i个是ai,则第k*l+i个与m互质的数是k*m+ai。

 

  所以,我就for一遍求出所有m以内的与m互质的数,然后根据周期性求解。(感觉有点暴力对吧)

 

代码如下,很短的:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<cmath>
 7 using namespace std;
 8 #define Maxn 1000010
 9 #define LL long long
10 
11 int p[Maxn],len;
12 
13 int gcd(int a,int b)
14 {
15     if(b==0) return a;
16     return gcd(b,a%b);
17 }
18 
19 int main()
20 {
21     int m,k;
22     while(scanf("%d%d",&m,&k)!=EOF)
23     {
24         if(m==1) {printf("%d\n",k);continue;}
25         len=0;
26         for(int i=1;i<=m;i++) if(gcd(i,m)==1) p[++len]=i;
27         int ans;
28         if(k%len==0) ans=(k/len-1)*m+p[len];
29         else ans=k/len*m+p[k%len];
30         printf("%d\n",ans);
31     }
32     return 0;
33 }
poj2773

 

2016-02-05 16:21:38

posted @ 2016-02-05 16:18  konjak魔芋  阅读(487)  评论(0编辑  收藏  举报