擴充套件尤拉定理
阿新 • • 發佈:2020-08-05
#include<bits/stdc++.h> using namespace std; const int Maxn = 1e7; typedef long long ll; int prim[Maxn+10],tol,phi[Maxn+10]; bool vis[Maxn+10]; void get(int n){ phi[1] = 1; for(int i=2;i<=n;i++) { if( !vis[i] ) prim[++tol] = i,phi[i] = i-1; for(int j=1;j<=tol&&i*prim[j]<=n;j++) { vis[i*prim[j]] = true; if( i%prim[j] == 0 ) { phi[i*prim[j]] = phi[i]*prim[j]; break; } phi[i*prim[j]] = phi[i]*(prim[j]-1); } } } void read(int &p){ int t = 0; char c; c=getchar(); while( c < '0' || c > '9' ) c=getchar(); while( c >= '0' && c <= '9' ) { t=t*10+c-'0'; c=getchar(); } p = t; } ll mypow(ll a,ll b,ll Mod){ ll inv = 1; while( b ) { if( b&1 ) inv = inv*a%Mod; a = a*a%Mod; b >>= 1; } return inv; } int solve(int p){ if( p == 1 ) return 0; return mypow(2,solve(phi[p])+phi[p],p); } int main(){ int T,p; read(T); get(Maxn); while( T-- ) { read(p); printf("%d\n",solve(p)); } return 0; }