#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<cstdlib>#include<cmath>#include<stack>#include<map>#include<string>#include<vector>#include<set>#include<bitset>#include<algorithm>usingnamespace std;#define ll long long#define INF 0x3f3f3f3f#define ull unsigned long long#define endl '\n'#define clr(a) memset(a, 0, sizeof(a))#define lowbit(x) x & -x#define ls rt << 1, l, mid#define rs rt << 1 | 1, mid + 1, r#define PB push_back#define POP pop_backconstdouble pi =acos(-1);constint maxn =1e5+101;constint maxm =1e7+101;const ll mod =1e9+7;constint hash_mod =19260817;
ll N, ans;int t;
ll fast_multi(ll m, ll n, ll mod)//快速乘法{
ll ans =0;//注意初始化是0,不是1while(n){if(n &1)
ans += m;
m =(m + m)% mod;//和快速幂一样,只不过这里是加
m %= mod;//取模,不要超出范围
ans %= mod;
n >>=1;}return ans;}
ll fast_pow(ll a, ll n, ll mod)//快速幂{
ll ans =1;
a %= mod;while(n){if(n &1)
ans =fast_multi(ans, a, mod);//不能直接乘
a =fast_multi(a, a, mod);
ans %= mod;
a %= mod;
n >>=1;}return ans;}int cnt;int Prime[maxm];bool prime[maxm];voidinit(){memset(prime,true,sizeof(prime));
prime[0]= prime[1]=false;for(int i =2; i < maxm ;++ i){if(prime[i]) Prime[++cnt]= i;for(int j =1; j <= cnt && i * Prime[j]< maxm ;++ j){
prime[i * Prime[j]]=false;if(i % Prime[j]==0)break;}}}boolsu(ll x){for(int j =1; j <= cnt ;++ j){if(x % Prime[j]==0)returnfalse;}returntrue;}intmain(){init();scanf("%d",&t);while(t--){scanf("%lld",&N);
ll n = N -1;
ans =1;while(1){if(su(n))break;//if(n <= N - 2)
n --;}//cout << n << endl;//cout << ans << endl;for(ll i = n +1; i <= N -2;++ i){
ans =fast_multi(ans,fast_pow(i,N-2,N)% N, N);}//cout << fast_pow(ans,N-2,N) % N << endl;
cout << ans << endl;}return0;}
miller robin
#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<cstdlib>#include<cmath>#include<stack>#include<map>#include<string>#include<vector>#include<set>#include<bitset>#include<algorithm>usingnamespace std;#define ll long long#define INF 0x3f3f3f3f#define ull unsigned long long#define endl '\n'#define clr(a) memset(a, 0, sizeof(a))#define lowbit(x) x & -x#define ls rt << 1, l, mid#define rs rt << 1 | 1, mid + 1, r#define PB push_back#define POP pop_backconstdouble pi =acos(-1);constint maxn =1e5+101;constint maxm =100+101;const ll mod =1e9+7;constint hash_mod =19260817;
ll N, ans;int t;
ll fast_multi(ll m, ll n, ll mod)//快速乘法{
ll ans =0;//注意初始化是0,不是1while(n){if(n &1)
ans += m;
m =(m + m)% mod;//和快速幂一样,只不过这里是加
m %= mod;//取模,不要超出范围
ans %= mod;
n >>=1;}return ans;}
ll fast_pow(ll a, ll n, ll mod)//快速幂{
ll ans =1;while(n){if(n &1)
ans =fast_multi(ans, a, mod);//不能直接乘
a =fast_multi(a, a, mod);
ans %= mod;
a %= mod;
n >>=1;}return ans;}
ll witness(ll a, ll n)//随机生成的a,来检测n的素性{
ll ans =1;
ll t = n -1;//这里需要注意,你如果没有改变乘方的次数的话,最后的判断就是(ans == a) ? 0 : 1;// 并且还要另外开辟空间来存储开始的a,比较麻烦,所以就这样了;
ll x;while(t){if(t &1){
ans =fast_multi(ans, a, n);}
x = a;//从这里开始就是迭代乘法,验证二次验证定理
a =fast_multi(a, a, n);//这里就相当于 x*x % m = 1if(a ==1&& x !=1&& x !=(n -1)){return1;// 这里需要注意,返回一的话就说明,追踪过程中,出现了不是素数的依据.}
t >>=1;}return(ans ==1)?0:1;}
ll MillerRobin(ll n, ll s)// 一般s取50就可以避免所有的偶然性了.{if(n ==2){return1;}if(n <2||!(n &1)){return0;}
ll a;for(ll i =0; i < s; i++){
a =fast_multi((ll)rand(), n-2,1e18+7)/ RAND_MAX +1;//这样生成的随机数就是真正的随机数了if(witness(a, n)){return0;}}return1;}intmain(){scanf("%d",&t);while(t--){scanf("%lld",&N);
ll n = N -1;
ans =1;while(1){if(MillerRobin(n,50))break;
n --;}//cout << n << endl;//cout << ans << endl;for(ll i = n +1; i <= N -2;++ i){
ans =fast_multi(ans,fast_pow(i,N-2,N)% N, N);}
cout << ans << endl;}return0;}