sb求助反演/kel
查看原帖
sb求助反演/kel
160839
Prean楼主2020/10/26 22:08

RT,type=1type = 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
*/
2020/10/26 22:08
加载中...