RT,type=1 的情况都一直 WA,对着题解看了还是 WA,到底哪儿写错了啊/kel
#include<cstdio>
const int M=1e5;
int A,B,C,top,mod,MOD,mu[M+5],Smu[M+5],zhi[M+5],pri[M+5];
int f[M+5],F[M+5],G[M+5],inv[M+5],fac[M+5],ifac[M];
inline int Add(const int&a,const int&b){
return a+b>=mod?a+b-mod:a+b;
}
inline int Del(const int&a,const int&b){
return a-b<0?a-b+MOD:a-b;
}
inline int min(const int&a,const int&b){
return a>b?b:a;
}
inline int trick(const int&n){
return (1ll*n*(n+1)>>1)%MOD;
}
inline int pow(int a,int b=mod-2,const int&p=mod){
int ans=1;
for(;b;b>>=1,a=1ll*a*a%p)if(b&1)ans=1ll*ans*a%p;
return ans;
}
inline void sieve(const int&n){
int i,j,x;zhi[1]=Smu[1]=mu[1]=1;
for(i=2;i<=n;++i){
if(!zhi[i])mu[pri[++top]=i]=-1;
for(j=1;j<=top&&(x=i*pri[j])<=n;++j){
zhi[x]=1;
if(!(i%pri[j])){
mu[x]=-1;break;
}
mu[x]=-mu[i];
}
Smu[i]=Smu[i-1]+mu[i];
}
}
inline void init(const int&n){
int i,j,x;
f[0]=f[1]=inv[1]=fac[0]=fac[1]=ifac[0]=ifac[1]=1;
for(i=2;i<=n;++i){
inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
ifac[i]=1ll*ifac[i-1]*inv[i]%mod;
f[i]=1ll*f[i-1]*pow(i,i)%mod;
fac[i]=1ll*fac[i-1]*i%mod;
}
for(i=0;i<=n;++i)F[i]=G[i]=1;
for(i=1;i<=n;++i){
for(j=1;(x=i*j)<=n;++j){
F[x]=1ll*F[x]*(mu[j]?~mu[j]?i:inv[i]:1)%mod;
}
G[i]=1ll*pow(F[i],1ll*i*i%MOD)%mod*G[i-1]%mod;
F[i]=1ll*F[i]*F[i-1]%mod;
}
}
inline int Solve(const int&n,const int&m){
int L,R,ans=1;
for(L=1;L<=n;L=R+1){
R=min(n/(n/L),m/(m/L));
ans=1ll*ans*Del(Smu[R],Smu[L-1])%MOD*(n/L)%MOD*(m/L)%MOD;
}
return ans;
}
inline int F1(const int&A,const int&B,const int&C){
int L,R,n=min(A,B),ans=1;
for(L=1;L<=n;L=R+1){
R=min(A/(A/L),B/(B/L));
ans=1ll*ans*pow(1ll*F[R]*pow(F[L-1])%mod,1ll*(A/L)*(B/L)%MOD)%mod;
}
return pow(ans,C);
}
inline int G1(const int&A,const int&B,const int&C){
int ta=pow(fac[A],B),tb=pow(fac[B],A);
return pow(1ll*ta*tb%mod,C);
}
inline int F2(const int&A,const int&B,const int&C){
int L,R,n=min(A,B),ans=1;
for(L=1;L<=n;L=R+1){
R=min(A/(A/L),B/(B/L));
ans=1ll*ans*pow(1ll*G[R]*pow(G[L-1])%mod,1ll*trick(A/L)*trick(B/L)%MOD)%mod;
}
return pow(ans,trick(C));
}
inline int G2(const int&A,const int&B,const int&C){
int ta=pow(f[A],1ll*trick(B)*trick(C)%MOD),tb=pow(f[B],1ll*trick(A)*trick(B)%MOD);
return pow(1ll*ta*tb%mod,trick(C));
}
inline int F3(const int&A,const int&B,const int&C){
int L,R,n=min(min(A,B),C),ans=1;
for(L=1;L<=n;L=R+1){
R=min(min(A/(A/L),B/(B/L)),C/(C/L));
ans=1ll*ans%mod*pow(1ll*f[R]*pow(f[L-1])%mod,1ll*(C/L)*Solve(A/L,B/L)%MOD);
}
return ans;
}
inline int G3(const int&A,const int&B,const int&C){
int L,R,n=min(min(A,B),C),ans=1;
for(L=1;L<=n;L=R+1){
R=min(min(A/(A/L),B/(B/L)),C/(C/L));
ans=1ll*ans*(1ll*fac[R]*fac[R]%mod)%mod*(1ll*ifac[L-1]*ifac[L-1]%mod)%mod;
ans=1ll*ans*pow(G1(A/L,B/L,C/L),Del(Smu[R],Smu[L-1]))%mod;
}
return ans;
}
signed main(){
int i,T;
scanf("%d%d",&T,&mod);MOD=mod-1;
sieve(1e5);init(1e5);
for(i=1;i<=T;++i){
scanf("%d%d%d",&A,&B,&C);
printf("%d ",1ll*G1(A,B,C)*pow(1ll*F1(A,B,C)*F1(A,C,B)%mod)%mod);
printf("%d ",1ll*G2(A,B,C)*pow(1ll*F2(A,B,C)*F2(A,C,B)%mod)%mod);
printf("%d ",1ll*G3(A,B,C)*pow(1ll*F3(A,B,C)*F3(A,C,B)%mod)%mod);
printf("\n");
}
}
/*
3 998244853
1 1 1
2 2 2
3 3 3
*/