萌新求助卡常
查看原帖
萌新求助卡常
287355
1lgorithm楼主2021/8/2 12:20

不管怎么卡,时间都不变。。。

#include<iostream>
#define ll long long
using namespace std;
ll mod,T;
const ll N=1e5+1;
ll f[N];
ll pmu[N];
ll mu[N];
ll p[N];
ll prime[N/10+1],cnt;
ll Inv[N];
ll pmuT[N];
ll xx[N];
ll phi[N];
inline int min(int a,int b){
	return a*(a<b)+b*(a>=b);
}
inline int qpmod(int a,int b,int p){
	if(b==-1) return qpmod(a,p-2,p);
	ll ans=1;
	while(b){
		if(b&1) ans=1ll*ans*a%p;
		b>>=1;
		a=1ll*a*a%p;
	}
	return ans;
}
inline int inv(ll n){
	return qpmod(n,mod-2,mod);
}
inline ll sum1(ll n){
	return n*(n+1)/2;
}
inline void prework(){
	pmu[0]=1;
	xx[0]=1;
	phi[1]=1;
	register ll i,j;
	for(i=1;i<N;++i){
		pmu[i]=1;
		Inv[i]=inv(i);
		xx[i]=qpmod(i,i,mod);
	}
	mu[1]=1;
	for(i=2;i<N;++i){
		if(p[i]==0){
			prime[++cnt]=i;
			mu[i]=-1;
			phi[i]=i-1;
		}
		for(j=1;j<=cnt&&i*prime[j]<N;++j){
			p[i*prime[j]]=1;
			if(i%prime[j]==0){
				mu[i*prime[j]]=0;
				phi[i*prime[j]]=phi[i]*prime[j];
				break;
			}
			mu[i*prime[j]]=-mu[i];
			phi[i*prime[j]]=phi[i]*(prime[j]-1);
		}
	}
	for(i=1;i<N;++i){
		for(j=i;j<N;j+=i){
			pmu[j]=pmu[j]*qpmod(i,mu[j/i],mod)%mod;
		}
	}
	pmuT[0]=1;
	for(i=1;i<N;++i) pmuT[i]=qpmod(pmu[i],i*i%(mod-1),mod);
	for(i=1;i<N;++i) pmuT[i]=pmuT[i-1]*pmuT[i]%mod;
	for(i=1;i<N;++i) pmu[i]=pmu[i]*pmu[i-1]%mod;
	for(i=1;i<N;++i) xx[i]=xx[i-1]*xx[i]%mod;
	f[0]=1;
	for(i=1;i<N;++i) f[i]=f[i-1]*i%mod;
	for(i=1;i<N;++i) phi[i]+=phi[i-1];
}
inline int calc1(int A,int B,int C){
	return qpmod(f[A],B*C%(mod-1),mod);
}
inline int calc2(int A,int B,int C){
	int sum=1,r;
	for(register int l=1;l<=A&&l<=B;++l){
		r=min(A/(A/l),B/(B/l));
		sum=sum*1ll*qpmod(pmu[r]*inv(pmu[l-1])%mod,(A/l)*(B/l)%(mod-1),mod)%mod;
		l=r;
	}
	return qpmod(sum,C,mod);
}
inline int calc3(int A,int B,int C){
	return qpmod(xx[A],sum1(B)%(mod-1)*sum1(C)%(mod-1),mod);
}
inline int calc4(int A,int B,int C){
	int sum=1,r;
	for(register int l=1;l<=A&&l<=B;++l){
		r=min(A/(A/l),B/(B/l));
		sum=sum*1ll*qpmod(pmuT[r]*inv(pmuT[l-1])%mod,sum1(A/l)%(mod-1)*sum1(B/l)%(mod-1),mod)%mod;
		l=r;
	}
	return qpmod(sum,sum1(C)%(mod-1),mod);
}
inline int calc5(int A,int B,int C){
	int sum=1,r;
	for(register int l=1;l<=A&&l<=B&&l<=C;++l){
		r=min(min(A/(A/l),B/(B/l)),C/(C/l));
		sum=sum*1ll*qpmod(qpmod(f[A/l],(B/l)*(C/l)%(mod-1),mod),(phi[r]-phi[l-1])%(mod-1),mod)%mod;
		l=r;
	}
	return sum;
}
inline int calc(int A,int B){
	int sum=1,r;
	for(register int l=1;l<=A&&l<=B;++l){
		r=min(A/(A/l),B/(B/l));
		sum=sum*1ll*qpmod(pmu[r]*inv(pmu[l-1])%mod,(A/l)*(B/l)%(mod-1),mod)%mod;
		l=r;
	}
	return sum;
}
inline int calc6(int A,int B,int C){
	int sum=1,r;
	for(register int l=1;l<=A&&l<=B&&l<=C;++l){
		r=min(min(A/(A/l),B/(B/l)),C/(C/l));
		sum=sum*1ll*qpmod(calc(A/l,B/l),(phi[r]-phi[l-1])%(mod-1)*(C/l)%(mod-1),mod)%mod;
		l=r;
	}
	return sum;
}
int main(){
	cin>>T>>mod;
	prework();
	while(T--){
		int A,B,C;
		cin>>A>>B>>C;
		cout<<1ll*calc1(A,B,C)*calc1(B,A,C)%mod*inv(calc2(A,B,C))%mod*inv(calc2(A,C,B))%mod<<' '<<1ll*calc3(A,B,C)*calc3(B,A,C)%mod*inv(calc4(A,B,C))%mod*inv(calc4(A,C,B))%mod<<' '<<1ll*calc5(A,B,C)*calc5(B,A,C)%mod*inv(calc6(A,B,C))%mod*inv(calc6(A,C,B))%mod<<endl; 
	}
}
2021/8/2 12:20
加载中...