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 }