题意:给定你一个MOD,然后再给你一个 ,随之 个数。
让你计算 的值。
思路:
指数循环节。根据欧拉降幂公式
可以递归计算。网上一部分代码是错误的。因为要注意后面的条件。只有大于等于的时候才可以套用公式,否则,直接快速幂返回即可。
const ll N = 2e5 + 10;
const ll mod = 1e9 ;
using namespace std;
const int maxm = 10000 + 3, maxn = 10 + 3;
int phi[maxm];
void process() {
memset(phi, 0, sizeof(phi));
phi[1] = 1;
for(int i = 2; i < maxm; ++i) if(!phi[i])
for(int j = i; j < maxm; j += i) {
if(!phi[j]) phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
}
ll Qpow(ll a,ll b,ll p){
ll ans = 1;
for(int i = 0;i < b;++i){
ans *= a;
if(ans > p) break;
if(i + 1 == b) return ans;
}
ans = 1;
while(b){
if(b&1) ans = ans * a % p;
b >>= 1;
a = a * a % p;
}
return ans + p;
}
int a[N];
ll solve(ll id,ll n,ll mod){
if(id == n) return a[n] >= mod?a[n]%mod + mod:a[n];
else return Qpow(a[id],solve(id+1,n,phi[mod]),mod);
}
char s[N];
int main(){
process();
int t = 0;
ll n,M;
while(gets(s)){
if(s[0] == '#') break;
stringstream ss(s);
ss >> M >> n;
for(int i = 1;i <= n;++i) ss >> a[i];
printf("Case #%d: %lld\n", ++t ,solve(1,n,M) % M);
}
}