70pts TLE求调
查看原帖
70pts TLE求调
435347
cyq32ent楼主2024/8/7 15:00
#include<bits/stdc++.h>
using namespace std;

#define int long long
namespace Convolution{
	int n=0,m=0,rev[999999],bit=0,len=1,mod=0,g=3,A[999999],B[999999];
	int qpow(int x,int k){
		int res=1;
		while(k){
			if(k&1) res=res*x%mod;
			x=x*x%mod;
			k>>=1;
		}
		return res;
	}
	
	void NTT(int*a,int opt){
		for(int i=0;i<len;i++)
			if(i<rev[i]) swap(a[i],a[rev[i]]);
		for(int mid=1;mid<len;mid<<=1){
			int tmp=qpow(g,(mod-1)/(mid*2));
			if(opt==-1) tmp=qpow(tmp,mod-2);
			for(int i=0;i<len;i+=mid*2){
				int w=1;
				for(int j=0;j<mid;j++,w=w*tmp%mod){
					int x=a[i+j],y=w*a[i+j+mid]%mod;
					a[i+j]=(x+y)%mod,a[i+j+mid]=(x-y+mod)%mod;
				}
			}
		}
	}void Convolution(int*a,int*b,int nn, int mm,int*output,int&cnt,int mod_num){
		mod=mod_num;n=nn;m=mm;
		memset(rev,0,sizeof rev);len=1;bit=0;
		for(int i=0;i<=n;i++)A[i]=a[i];
		for(int i=0;i<=m;i++)B[i]=b[i];
		while(len<=n+m) len<<=1,bit++;
		for(int i=0;i<len;i++) rev[i]=(rev[i>>1]>>1) | ((i&1)<<(bit-1));
		NTT(A,1);NTT(B,1);
		for(int i=0;i<len;i++) A[i]=A[i]*B[i]%mod;
		NTT(A,-1);
		int inv=qpow(len,mod-2);
		for(int i=0;i<=n+m;i++){
			output[i]=A[i]*inv%mod;
		}
		return;
	}
}

int a[999999],b[999999];int output[999999],cnt;//end of NTT templete

int frac[999999],invfrac[999999];
void initfrac(int n,int mod){
	Convolution::mod=mod;
	frac[0]=invfrac[0]=1;for(int i=1;i<=n;i++){
		frac[i]=frac[i-1]*i%mod;
		invfrac[i]=Convolution::qpow(frac[i],mod-2);
	}
}//end of math templete


void init(int n,int mod){
	initfrac(n,mod);
	for(int i=0;i<=n;i++)a[i]=b[i]=invfrac[i];
	for(int i=0;i<=n;i++){
		a[i]*=((i&1)?(-1):1);
		b[i]=b[i]*Convolution::qpow(i,n)%mod;
		a[i]=(a[i]+mod)%mod;
	}
}

int n,mod=167772161;
signed main(){
	cin>>n;
	
	init(n,mod);
	Convolution::Convolution(a,b,n,n,output,cnt,mod);
	for(int i=0;i<=n;i++)printf("%lld ",output[i]);
	return 0;
}

略大于500ms500ms

2024/8/7 15:00
加载中...