建议开大空限
查看原帖
建议开大空限
1010650
Expert_Dreamer楼主2024/10/7 13:43
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 18000001
#define N2 500001
const int mod=998244353;
int *r=new int[N2],*f=new int[N2],*g=new int[N2];
int ksm(int a,int k){
    int res=1;
    while(k){
        if(k&1) res=res*a%mod;
        a=a*a%mod;
        k>>=1;
    }
    return res;
}
void ntt(int *a,int n,int x) {
	for(int i=0;i<n;i++) if(i<r[i]) swap(a[i],a[r[i]]);
	for(int i=1;i<n;i<<=1) {
		int z=ksm(3,(mod-1)/(i*2));
		for(int j=0;j<n;j+=(i*2)) {
			int t1,t2,g=1;
			for(int k=0;k<i;k++,g=g*z%mod) {
				t1=a[j+k],t2=g*a[j+k+i]%mod;
				a[j+k]=(t1+t2)%mod,a[j+k+i]=(t1-t2+mod)%mod;
			}
		}
	}
	if(x==1) return;
	int inv=ksm(n,mod-2); 
	reverse(a+1,a+n);
	for(int i=0;i<n;i++) a[i]=a[i]*inv%mod;
}
void mul(int n,int m,int *a,int *b){
	int len=1,l=0;
	for(;len<=n+m;len<<=1,l++);
	for(int i=1;i<len;i++) r[i]=(r[i/2]/2)|((i&1)<<(l-1));
	ntt(a,len,1),ntt(b,len,1);
	for(int i=0;i<=len;i++)a[i]=(a[i]*b[i])%mod;
	ntt(a,len,-1);
}
void stirling(int n){
    f[0]=1;
    for(int i=1;i<=n;i++)f[i]=f[i-1]*i%mod;
    f[n]=ksm(f[n],mod-2);
    for(int i=n;i>=1;i--)f[i-1]=f[i]*i%mod;
    for(int i=0;i<=n;i++){
        if(i%2)g[i]=mod-f[i];
        else g[i]=f[i];
        f[i]=f[i]*ksm(i,n)%mod;
    }
    mul(n,n,f,g);
}
int n,m,s,l,a,b,c;
vector<int>fac,inv_fac;
signed main(){
    cin>>n>>m>>s>>l;
    stirling(l);
    delete[] r;
    delete[] g;
    fac.push_back(1);
    for(int i=1;i<=n;i++)fac.push_back(fac[i-1]*i%mod);
    inv_fac.resize(n+1);
    inv_fac[n]=ksm(fac[n],mod-2);
    for(int i=n;i>=1;i--)inv_fac[i-1]=inv_fac[i]*i%mod;
    while(s--){
        cin>>a>>b>>c;
        int cnt=min(l,min(b,c));
        int ans=0;
        for(int i=0;i<=cnt;i++){
            ans=(ans+f[i]*inv_fac[b-i]%mod*fac[a-i]%mod*inv_fac[c-i])%mod;
        }
        cout<<ans*fac[b]%mod*fac[c]%mod*inv_fac[a]%mod<<endl;
    }
}

开小 RE,开大 MLE,建议开到 500M,放一些多项式写烂的蒟蒻吧……

2024/10/7 13:43
加载中...