根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b)
如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性。
所以只要求出小于n且与n互质的元素即可。
#include<stdio.h> #include<string.h> const int N=1000100; int pr[N],cnt; int gcd(int a,int b){ if(!b) return a; return gcd(b,a%b); } int main(){ int n,k; while(~scanf("%d%d",&n,&k)){ cnt=0; for(int i=1;i<=n;i++){ if(gcd(n,i)==1) pr[++cnt]=i; } if(k%cnt) printf("%d ",k/cnt*n+pr[k%cnt]); else printf("%d ",(k/cnt-1)*n+pr[cnt]); } return 0; }
也可以用欧拉函数求小于n且与n互质的元素。就不用O(N)了。速度提高10倍左右。