UVA-10692 Huge Mods

题目大意:计算a1^a2^a3^a4......^an模m的值。

题目解析:幂取模运算的结果一定有周期。一旦找到周期就可把高次幂转化为低次幂。有降幂公式

        (a^x)%m=(a^(x%phi(m)+phi(m))%m  x>=phi(m)

其中,phi()函数是欧拉函数。

代码(代码有瑕疵)如下:

 1 # include<iostream>
 2 # include<cstdio>
 3 # include<cstring>
 4 # include<algorithm>
 5 using namespace std;
 6 # define ll long long
 7 int num[12],n;
 8 char start[8];
 9 int phi(int x)
10 {
11     int m=x;
12     int ans=x;
13     for(int i=2;i*i<=x;++i){
14         if(m%i==0){
15             ans=ans/i*(i-1);
16             while(m%i==0)
17                 m/=i;
18         }
19     }
20     if(m>1)
21         ans=ans/m*(m-1);
22     return ans;
23 }
24 int mypow(int a,int b,int m)
25 {
26     int res=1;
27     while(b){
28         if(b&1)
29             res=res*a%m;
30         b>>=1;
31         a=a*a%m;
32     }
33     return res;
34 }
35 int work(int i,int m)
36 {
37     if(i==n-1)
38         return num[i]%m;
39     int tm=phi(m);         
40     int nm=work(i+1,tm)+tm;    
41     return mypow(num[i],nm,m);
42 }
43 int main()
44 {
45     int cas=0;
46     while(scanf("%s",start)&&start[0]!='#')
47     {
48         int mod=0;
49         for(int i=0;i<strlen(start);++i)
50             mod=mod*10+start[i]-'0';
51         scanf("%d",&n);
52         for(int i=0;i<n;++i)
53             scanf("%d",&num[i]);
54         printf("Case #%d: %d\n", ++cas, work(0, mod));
55     }
56     return 0;
57 }

 

posted @ 2015-08-06 14:25  20143605  阅读(610)  评论(3编辑  收藏  举报