pku773_Happy 2006
2011-05-23 06:14 Min·zc 阅读(178) 评论(0) 编辑 收藏 举报详细报告移步这里
http://blog.csdn.net/shiren_Bod/archive/2010/07/17/5741029.aspx
1 #include <iostream>
2 #include <memory.h>3 using namespace std;
4 int s[1000001];
5 int prime[80000];
6 void Prime()
7 {
8 memset(s,0,sizeof(s));
9 memset(prime,0,sizeof(prime));
10 for(int i=2;i<=1000000;i++)
11 if(s[i]==0)
12 for(int j=2;j*i<=1000000;j++)
13 s[j*i]=1;
14 prime[0]=1;
15 for(int i=2;i<=1000000;i++)
16 if(s[i]==0)
17 prime[prime[0]++]=i;
18 }
19 int eular(int n)
20 {
21 int ret=1;
22 for(int i=1;i<prime[0]&&prime[i]*prime[i]<=n;i++)
23 if(n%prime[i]==0)
24 {
25 ret*=(prime[i]-1);
26 n/=prime[i];
27 while(n%prime[i]==0)
28 {
29 n/=prime[i];
30 ret*=prime[i];
31 }
32 }
33 if(n>1)
34 ret*=(n-1);
35 return ret;
36 }
37 int gcd(int a,int b)
38 {
39 if(!b)
40 return a;
41 else
42 return gcd(b,a%b);
43 }
44 int main()
45 {
46 Prime();
47 int n,m;
48 while(cin>>n>>m)
49 {
50 int len=eular(n);
51 // cout<<len<<endl;
52 // cout<<"asd"<<endl;
53 int ps=m>len?m%len:m;
54 if(ps==0)
55 ps=len;
56 // cout<<ps<<endl;
57 int i;
58 if(m<len)
59 i=1;
60 else if(m%len==0)
61 i=(m/len-1)*n+1;
62 else
63 i=m/len*n+1;
64 // cout<<i<<endl;
65 for(;ps!=0;i++)
66 if(gcd(i,n)==1)
67 {
68 ps--;
69 if(ps==0)
70 break;
71 }
72 cout<<i<<endl;
73 }
74 }