poj 2773
欧拉函数。
代码:
#include<iostream> #include<fstream> #include<cmath> using namespace std; int a[1001]; int b[1000001]; int n,m; void read(){ // ifstream cin("in.txt"); int i,j,k,ans,s; for(i=4;i<=1000;i+=2) a[i]=1; for(i=3;i<=1000;i+=2) if(a[i]==0) for(j=2*i;j<=1000;j+=i) a[j]=1; while(cin>>n>>m){ s=n;ans=1; memset(b,0,sizeof(b)); for(i=2;i<=n&&i*i<=s;i++) if(a[i]==0&&n%i==0) { j=0; while(n%i==0) { n/=i; j++; } ans*=pow(1.*i,j-1)*(i-1); for(j=i;j<=s;j+=i) b[j]=1; } if(n>1) { ans*=n-1; for(j=n;j<=s;j+=n) b[j]=1; } k=(m-1)%ans; k++; j=0; for(i=1;i<=s;i++) if(b[i]==0) { j++; if(j==k) break; } cout<<(m-1)/ans*s+i<<endl; } } int main(){ read(); return 0; }