uva 10692(指數迴圈節)
阿新 • • 發佈:2019-01-31
遞迴用的很巧妙,雖然不是我想出來的
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #define ls 2*rt #define rs 2*rt+1 #define lson ls,L,mid #define rson rs,mid+1,R #define ll long long using namespace std; typedef pair<int,int> pii; const ll inf = 0x3f3f3f3f; /*void dis(int a[], int n){ printf("總數為%d個\n",n); for(int i = 0; i < n; i++) cout<<a[i]<<", "; cout<<endl<<"------------------"<<endl; }*/ const int mx = 1e3+100; char s[mx]; int a[mx],mod,n; ll eular(ll n) { ll ret=1,i; for(i=2;i*i<=n;i++) { if(n%i==0) { n/=i,ret*=i-1; while(n%i==0) n/=i,ret*=i; } } if(n>1) ret*=n-1; return ret; } ll power(ll a, ll b, ll m){ if(b == 0) return 1; ll ans= 1; a %= m; while(b){ if(b%2) ans = ans*a%m; b/=2; a = a*a%m; } return ans; } ll slove(int i, int mod){ if(i == n-1) return a[i]%mod; int eu = eular(mod); int nu = slove(i+1,eu) + eu; return power(a[i],nu,mod); } int main(){ int ca = 0; while(scanf("%s",s) && s[0] != '#'){ mod = 0; int len = strlen(s); for(int i = 0; i < len; i++) mod = mod*10+s[i]-'0'; scanf("%d",&n); for(int i = 0; i < n; i++){ scanf("%d",a+i); } printf("Case #%d: %lld\n",++ca,slove(0,mod)); } return 0; }