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 }

 

posted on 2012-07-15 20:28  usp10  阅读(218)  评论(0编辑  收藏  举报

导航