求助type=2
查看原帖
求助type=2
553501
可爱的小棉羊楼主2023/11/26 09:47
#include<bits/stdc++.h>
using namespace std;
bool book[100005];
int prime[100005],p,q;
long long g[100005],faci[100005],gt2[100005],cnt,mu[100005],fac[100005],inv[1000005];
long long inv_g[100005],inv_gt2[100005],phi[100005];
long long fpow(long long a,long long b){
	long long ans=1;
	while(b){
		if(b&1)ans=ans*a%p;
		a=a*a%p;
		b>>=1;
	}
	return ans%p;
}
void init(){
	mu[1]=book[1]=g[1]=1;
	inv[1]=1;
	for(int i=2;i<=100000;i++)inv[i]=(p-p/i)*inv[p%i]%p;
	for(int i=2;i<=100000;i++){
		g[i]=1;
		if(!book[i]){
			mu[i]=-1;
			phi[i]=i-1;
			prime[++cnt]=i;
		}
		for(int j=1;prime[j]*i<=100000&&j<=cnt;j++){
			book[i*prime[j]]=1;
			if(i%prime[j]==0){
				phi[i*prime[j]]=phi[i]*prime[j];
				mu[i*prime[j]]=0;
				break;
			}else {
				phi[i*prime[j]]=phi[i]*phi[prime[j]];
				mu[i*prime[j]]=-mu[i];
			}
		}
	}
	for(int i=1;i<=100000;i++)phi[i]=(phi[i-1]+phi[i]);
	fac[0]=1;
	faci[0]=1;
	for(int i=1;i<=100000;i++){
		fac[i]=1ll*fac[i-1]*i%p;
		faci[i]=faci[i-1]*fpow(i,i)%p;
	}
	for(int i=1;i<=100000;i++){
		if(!mu[i])continue;
		for(int j=1;j*i<=100000;j++)g[j*i]=g[j*i]*(mu[i]==1? j:inv[j])%p;
	}
	for(int i=1;i<=100000;i++)gt2[i]=fpow(g[i],1ll*i*i%(p-1));
	for(int i=2;i<=100000;i++)gt2[i]=gt2[i]*gt2[i-1]%p;
	g[0]=1;
	for(int i=2;i<=100000;i++)g[i]=g[i-1]*g[i]%p;
	inv_g[0]=1;
	inv_gt2[0]=1;
	for(int i=1;i<=100000;i++){
		inv_g[i]=fpow(g[i],p-2);
		inv_gt2[i]=fpow(gt2[i],p-2);
	}
}
long long gi0(int a,int b,int c){
	return fpow(fac[a],1ll*b*c%(p-1));
}
long long ggc0(int a,int b,int c){
	long long ans=1;
	int l=1;
	if(a>b)swap(a,b);
	while(l<=a){
		int r;
		if(b/l==0||a/l==0)r=a;
		else r=min(b/(b/l),a/(a/l));
		ans=ans*(fpow(g[r]*inv_g[l-1]%p,1ll*(b/l)*(a/l)%(p-1)))%p;
		l=r+1;
	}
	return fpow(ans,c);
}
long long S(int x){
	return 1ll*x*(x+1)/2;
}
long long gi1(int a,int b,int c){
	return fpow(faci[a],(1ll*S(b)%(p-1)*(S(c)%(p-1)))%(p-1));
}
long long ggc1(int a,int b,int c){
	long long ans=1;
	int l=1;
	if(a>b)swap(a,b);
	while(l<=a){
		int r;
		if(b/l==0||a/l==0)r=a;
		else r=min(b/(b/l),a/(a/l));
		ans=ans*(fpow(gt2[r]*inv_gt2[l-1]%p,1ll*S(b/l)%(p-1)*S(a/l)%(p-1)))%p;
		l=r+1;
		//cout<<114514;
	}
	return fpow(ans,S(c)%(p-1));
}
long long gi2(int a,int b,int c){
	int l=1; 
	long long ans=1;
	while(l<=min(a,min(b,c))){
		int r;
		if(a/l==0||b/l==0||c/l==0)r=a;
		else r=min(a/(a/l),min(b/(b/l),c/(c/l)));
		ans=ans*(fpow(fac[a/l],(1ll*(phi[r]-phi[l-1])%(p-1)*(b/l)%(p-1)*(c/l)%(p-1))))%p;
		l=r+1;
	}
}
long long ggc2(int a,int b,int c){
	long long ans=1;
	int l=1;
	while(l<=min(a,min(b,c))){
		int r;
		if(a/l==0||b/l==0||c/l==0)r=a;
		else r=min(a/(a/l),min(b/(b/l),c/(c/l)));
		ans=ans*fpow(ggc0(a/l,b/l,c/l)%p,1ll*(phi[r]-phi[l-1])%(p-1));
		l=r+1;
	}
	return ans;
}
long long ft0(int a,int b,int c){
	return gi0(a,b,c)*gi0(b,a,c)%p*fpow(ggc0(a,b,c)*ggc0(a,c,b)%p,p-2)%p;	
}
long long ft1(int a,int b,int c){
	return gi1(a,b,c)*gi1(b,a,c)%p*fpow(ggc1(a,b,c)*ggc1(a,c,b)%p,p-2)%p;	
}
long long ft2(int a,int b,int c){
	return gi2(a,b,c)*gi2(b,a,c)%p*fpow(ggc2(a,b,c)*ggc2(a,c,b)%p,p-2)%p;	
}
int main(){
	
	cin>>q>>p;
	init();
	while(q--){
		int a,b,c;
		cin>>a>>b>>c;
		cout<<ft0(a,b,c)<<" "<<ft1(a,b,c)<<" "<<ft2(a,b,c)<<endl;
	}
} 
2023/11/26 09:47
加载中...