UVA10692 Huge Mods(指数循环节)

题意:给定你一个MOD,然后再给你一个 n n ,随之 n n 个数。

让你计算 a 1 a 2 a 3 . . . . m o d    M O D a_1^{a_2^{a_3^....}}\mod 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);
    }
}
发布了589 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_43408238/article/details/104365739