题目描述:
分析:
根据欧几里德,我们有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
时间: 2024-08-13 22:01:31