luogu P4139 上帝与集合的正确用法

https://www.luogu.com.cn/problem/P4139
扩展欧拉定理
a b = a b m o d    ϕ ( p ) + ϕ ( p ) ( m o d    p ) \large a^b=a^{b \mod \phi(p)+\phi(p)} (\mod p) ab=abmodϕ(p)+ϕ(p)(modp)
带入即可
code:

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define int long long
#define N 10000005
using namespace std;
int prime[5000005], sz, phi[N];
bitset<N> vis;
void get_phi(int n){
    for(int i = 2; i <= n; i ++){
        if(!vis[i]){
            prime[++ sz] = i;
            phi[i] = i - 1;
        }
        for(int j = 1; j <= sz && prime[j] * i <= n; j ++){
            vis[prime[j] * i] = 1;
            if(i % prime[j] == 0){
                phi[i * prime[j]] = phi[i] * prime[j];
                break;
            }
            phi[i * prime[j]] = phi[i] * (prime[j] - 1);
        }
    }
}
int poww(int x, int y, int mod){
    int ans = 1;
    for(; y; y >>= 1, x = x * x % mod) if(y & 1) ans = ans * x % mod;
    return ans;
}
int f(int p){
    if(p == 1) return 0;
    int x = phi[p];
    return poww(2, f(x) + x, p);
}
int t, p;
signed main(){
    get_phi(10000000);
    scanf("%lld", &t);
    for(int i = 1; i <= t; i ++){
        scanf("%lld", &p);
        printf("%lld\n", f(p));
    }
    return 0;
}
posted @ 2021-07-17 22:43  lahlah  阅读(47)  评论(0编辑  收藏  举报