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; }