Submission #70662075


Source Code Expand

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=4e6+15,P=998244353,G=3;
inline ll ksm(ll a,int b){
	ll res=1;
	while(b){
		if(b&1)res=res*a%P;
		a=a*a%P,b>>=1;
	}
	return res;
}
inline int gt(int x){int tp=1;while(tp<=x)tp<<=1;return tp;}
ll pw[N];
ll sinv[N];
ll fac[N],inv[N];
inline void init(int n){
	int W1=1,W2=0;
	while((W1<<1)<=n)W1<<=1;
	ll ts=ksm(G,(P-1)/(W2=W1<<1));pw[W1]=1;
	for(int i=W1+1;i<W2;i++)pw[i]=pw[i-1]*ts%P;
	for(int i=W1-1;i>=1;i--)pw[i]=pw[i<<1];
	sinv[1]=1;
	for(int i=2;i<=W2;i++)sinv[i]=sinv[P%i]*(P-P/i)%P;
	fac[0]=inv[0]=1;
	for(int i=1;i<=W2;i++)fac[i]=fac[i-1]*i%P;
	inv[W2]=ksm(fac[W2],P-2);
	for(int i=W2-1;i>=1;i--)inv[i]=inv[i+1]*(i+1)%P;
}
int rev[N];
inline void crv(int lim,int len){for(int i=1;i<lim;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(len-1));}
using vi=vector<int>; 
inline int mol(int x,int y){return x+y>=P?x+y-P:x+y;}
struct Poly{
	vi f;
	Poly(){}
	Poly(int len){f.resize(len);}
	inline void resize(int len){f.resize(len);}
	inline int& operator [](const int x){return f[x];}
	inline const int& operator [](const int x)const{return f[x];}
	void NTT(int lim,int typ){
		crv(lim,__lg(lim));
		if(typ==-1)reverse(f.begin()+1,f.end());
		if((int)f.size()!=lim)f.resize(lim);
		for(int i=0;i<lim;i++)if(i<rev[i])swap(f[i],f[rev[i]]);
		for(int mid=1;mid<lim;mid<<=1){
			for(int j=0;j<lim;j+=(mid<<1)){
				for(int k=0;k<mid;k++){
					int x=f[j+k],y=pw[mid+k]*f[j+k+mid]%P;
					f[j+k]=mol(x,y),f[j+k+mid]=mol(x,P-y);
				}
			}
		}
		if(typ==-1){
			for(int i=0;i<lim;i++)f[i]=f[i]*sinv[lim]%P;
		}
	}
	void Mul(Poly &B,int lim){
		Poly X=*this,Y=B;
		X.NTT(lim,1);Y.NTT(lim,1);
		for(int i=0;i<lim;i++)X[i]=1ll*X[i]*Y[i]%P;
		X.NTT(lim,-1);*this=X;
	}
	void Inv(int n){
		Poly X(1),t1,t2;X[0]=f[0]==1?1:ksm(f[0],P-2);
		for(int len=2;(len>>1)<=n;len<<=1){
			int las=len>>1;t1=X;
			for(int i=0;i<las;i++)t1[i]=mol(t1[i],t1[i]);
			int lim=len<<1;X.NTT(lim,1); 
			for(int i=0;i<lim;i++)X[i]=1ll*X[i]*X[i]%P;
			t2.resize(len);
			for(int i=0;i<len;i++)t2[i]=(i<=n?f[i]:0);
			t2.NTT(lim,1);
			for(int i=0;i<lim;i++)X[i]=1ll*X[i]*t2[i]%P;
			X.NTT(lim,-1);X.resize(len);
			for(int i=0;i<len;i++)X[i]=P-X[i],(X[i]==P)&&(X[i]==0);
			for(int i=0;i<las;i++)X[i]=mol(t1[i],X[i]);
		}
		X.resize(n+1);
		*this=X;
	}
	void Sqrt(int n){
		Poly X(1),t1,t2;X[0]=1;
		for(int len=2;(len>>1)<=n;len<<=1){
			int las=len>>1;
			t1=X;X.resize(len);X.Inv(len-1);t2.resize(len);
			for(int i=0;i<len;i++)t2[i]=(i<=n?f[i]:0);
			X.Mul(t2,len<<1);X.resize(len);
			for(int i=0;i<las;i++)X[i]=mol(t1[i],X[i]);
			for(int i=0;i<len;i++)X[i]=sinv[2]*X[i]%P;
		}
		X.resize(n+1);*this=X;
	}
	void Intg(){
		int len=f.size();
		resize(len+1);
		for(int i=len;i>=1;i--)f[i]=f[i-1]*sinv[i]%P;
		f[0]=0;
	}
	void Diff(){
		int len=f.size();
		for(int i=0;i<len-1;i++)f[i]=1ll*(i+1)*f[i+1]%P;
		resize(len-1);
	}
	void Ln(int n){
		resize(n+1);
		Poly B=*this;B.Inv(n);
		Diff();Mul(B,gt(n<<1));
		resize(n);Intg();
	}
	void Exp(int n){
		Poly X(1),t1;X[0]=1;
		for(int len=2;(len>>1)<=n;len<<=1){
			t1=X;X.Ln(len-1);
			for(int i=0;i<len;i++)X[i]=mol(P-X[i],i<=n?f[i]:0);
			X[0]=mol(X[0],1);
			X.Mul(t1,len<<1);X.resize(len);
		}
		X.resize(n+1);*this=X;
	}
	void Kpow(int n,int k){
		Ln(n);for(int i=0;i<=n;i++)f[i]=1ll*f[i]*k%P;
		Exp(n);
	}
};
int n,m;
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	init(gt(max(n,m)+1));
	Poly F(n+1);
	F[0]=1;
	for(int i=1;i<=m;i++){
		Poly G(n+1);
		for(int j=0;j<=min(n,i);j++){
			G[j]=inv[j];
		}
		F.Mul(G,gt((n+1)<<1));
		F.resize(n+1);
	}
	cout<<F[n]*fac[n]%P<<"\n";
	return 0;
}

Submission Info

Submission Time
Task E - Sequence 3
User take_that
Language C++ 20 (gcc 12.2)
Score 3
Code Size 3745 Byte
Status AC
Exec Time 14 ms
Memory 3668 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 3 / 3
Status
AC × 2
AC × 7
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 02_min_00.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3668 KiB
00_sample_01.txt AC 14 ms 3596 KiB
01_random_00.txt AC 6 ms 3452 KiB
01_random_01.txt AC 5 ms 3484 KiB
01_random_02.txt AC 5 ms 3496 KiB
01_random_03.txt AC 1 ms 3448 KiB
02_min_00.txt AC 1 ms 3396 KiB