poj 2773 happy2006
昨天学习了欧拉,今天就来做了道欧拉的题目吧,这题有欧拉,还有运用到一个数学得知识--假设i与n互质,则n*自然数+i与n也是互质的,这样就能先找出与n互质的所有小于n的数字,然后后面就是一个循环,只是会按n*k(k=0,1,2,3,。。。)+i这种规律下去,只要求求就好了, 不过要注意他在第几个循环是比较麻烦的,人家指导我在求第几个循环的时候k要减一再除,就过了。。。
View Code
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #include<math.h> 5 int s[1000100]; 6 int dp[1000100],dpn; 7 long k,m; 8 void prime()//欧拉 9 { 10 int i,j; 11 memset(s,0,sizeof(s)); 12 s[1]=1; 13 /*for(i=2;i<=1000000;i++) 14 s[i]=i;*/ 15 for(i=2;i<=1000000;i++) 16 { 17 if(!s[i]) 18 { 19 s[i]=i-1; 20 j=i+i; 21 while(j<=1000000) 22 { 23 if(!s[j]) 24 s[j]=j; 25 s[j]=s[j]/i*(i-1); 26 j+=i; 27 } 28 } 29 } 30 return ; 31 } 32 33 int dpit()//找出所有互质的数字 34 { 35 int i,j; 36 memset(dp,0,sizeof(dp)); 37 for(i=2;i<=m;i++) 38 { 39 j=i; 40 if(!dp[i]&&m%i==0) 41 while(j<=m) 42 { 43 dp[j]=1; 44 j+=i; 45 } 46 } 47 return 0; 48 } 49 int main() 50 { 51 prime(); 52 while(scanf("%ld%ld",&m,&k)!=EOF) 53 { 54 long a,b,t=0,x; 55 dpn=0; 56 a=(k-1)/s[m]; 57 b=k%s[m]; 58 if(!b)b=s[m]; 59 dpit(); 60 for(x=1;x<=m;x++) 61 { 62 if(!dp[x]) 63 t++; 64 if (t==b) 65 { 66 a=m*a+x; 67 printf("%ld\n",a); 68 break; 69 } 70 } 71 } 72 return 0; 73 }