P4139 上帝与集合的正确用法(扩展欧拉定理)

传送门

题目描述:

(2^inf)modp

思路:扩展欧拉定理

博客:here

 

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 10000005;
const int inf = 0x3f3f3f3f;
int phi[maxn],vis[maxn],tot,prm[maxn];
void initphi(int n) {//线性筛求欧拉函数
    for (int i = 2; i <= n; i++) {
        if (!vis[i]) {
            prm[++tot] = i; phi[i] = i - 1;
        }
        for (int j = 1; j <= tot && prm[j] * i <= n; j++) {
            vis[prm[j] * i] = 1;
            if (i % prm[j] == 0) {
                phi[i * prm[j]] = phi[i] * prm[j];
                break;
            }
            else {
                phi[i * prm[j]] = phi[i] * phi[prm[j]];
            }
        }
    }
}
ll qpow(ll a, ll n,ll p) {//快速冥模板
    ll sum = 1;
    while (n) {
        if (n&1) {
            sum =(sum*a)%p;
        }
        n>>= 1;
        a = (a * a) % p;
    }
    return sum;
}
ll sovle(ll a, ll n, ll p) {//扩展欧拉函数求(a^n)%p
    if (p == 1)return 0;
    if (n == 0)return 1;
    return qpow(a, sovle(a, n - 1, phi[p]) + phi[p], p);
}
int main() {
    //freopen("test.txt", "r", stdin);
    initphi(maxn - 1);
    int t; scanf("%d", &t);
    while (t--) {
        int mod; scanf("%d", &mod);
        printf("%lld\n", sovle(2, inf, mod));
    }
    return 0;
}

 

posted @ 2021-04-23 16:09  cono奇犽哒  阅读(65)  评论(0)    收藏  举报