1. 程式人生 > 實用技巧 >擴充套件尤拉定理

擴充套件尤拉定理

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