首先要知道一个公式
N!mod M =(M - N - 1)mod M 的逆元
这样就很快知道了 还有要注意计算过程中精度的问题 用 unsigned long long 还爆所以用__int128
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
ll MOD;
ll Mode(__int128 a, __int128 b, __int128 mode)
{
ll sum = 1;
while (b) {
if (b & 1) {
sum = (sum * a) % mode;
b--;
}
b /= 2;
a = a * a % mode;
}
return sum;
}
ll inv(ll n){
return Mode(n,MOD-2,MOD);
}
ll isp(ll n){
for(ll i=2;i<=sqrt(n);i++)
if(n%i==0)
return 0;
return 1;
}
int main(){
int n;
cin>>n;
while(n--){
long long p,mod,k;
cin>>mod;
MOD = mod;
if((mod+1)%6 == 0){
k = (mod+1)/6;
p = (k-1)*6 + 1;
bool ffff=0;
while(!isp(p)){
if(!ffff)
p=(k-1)*6-1;
else
k--,p=(k-1)*6+1;
ffff=1-ffff;
}
}else{
k = (mod-1)/6;
p = k*6-1;
bool ffff=0;
while(!isp(p)){
if(ffff)
p=k*6-1;
else
k--,p=k*6+1;
ffff=1-ffff;
}
}
ll sum = 1;
for(int i = 2;i <= mod - p - 1;i++){
sum = (sum * i)%mod;
}
cout<<inv(sum%mod)<<endl;
}
}