社区讨论

蒟蒻刚学 OI 10^-114 ms,48pts,WA+TLE,求调

P5273【模板】多项式幂函数(加强版)参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj01zbo
此快照首次捕获于
2025/11/03 18:30
4 个月前
此快照最后确认于
2025/11/03 18:30
4 个月前
查看原帖
测评记录:https://www.luogu.com.cn/record/243110711
CPP
/*我们所可以自慰的,想来想去,也还是所谓对于将来的希望。

希望是附丽于存在的,有存在,便有希望,有希望,便是光明。*/
#include<bits/stdc++.h>
using namespace std;
constexpr int p=998244353,N=5e5+5;
int f[N],g[N],rev[N],inv[N],kk[N],tmp[N],d[N],q[N],a[N],ptr,n,k1,k2;string k;
inline int qpw(int a,int T){
	int ret=1;
	for(;T;T>>=1,a=1ull*a*a%p) if(T&1) ret=1ull*a*ret%p;
	return ret;
}
inline void init(int n){
	int b=__lg(n);
	for(int i=1;i<n;++i) rev[i]=(rev[i>>1]>>1)+((i&1)<<(b-1));
	return;
}
inline void NTT(int*const& a,int n,int type){
	const int g=(~type)? 3:332748118;
	for(int i=0;i<n;++i) if(i<rev[i]) swap(a[i],a[rev[i]]);
	for(int len=2,wn,l,a0,a1;len<=n;len<<=1){
		l=len>>1,wn=qpw(g,(p-1)/len);
		for(int i=0;i<n;i+=len){
			for(int j=0,w=1;j<l;++j,w=1ull*w*wn%p){
				a0=a[i+j],a1=1ull*w*a[i+j+l]%p;
				a[i+j]=(0ull+a0+a1)%p,a[i+j+l]=((0ll+a0-a1)%p+p)%p;
			}
		}
	}
	if(!~type) for(int i=0,inv=qpw(n,p-2);i<n;++i) a[i]=1ull*inv*a[i]%p;
	return;
}
inline void derivative(int* a,int* res,int n){
	for(int i=1;i<n;++i) res[i-1]=1ull*a[i]*i%p;
	return res[n-1]=0,void();
}
inline void integrate(int* a,int* res,int n){
	for(int i=1;i<n;++i) res[i]=1ull*a[i-1]*inv[i]%p;
	return res[0]=0,void();
}
inline void polyinv(int* a,int* f,int n){
	static int temp[N];
	fill(f,f+(n<<1),0);
	f[0]=qpw(a[0],p-2);
	for(int t=2;t<=(n<<1);t<<=1){
		int k=t<<1;
		init(k);
		copy(a,a+t,temp);
		fill(temp+t,temp+k,0);
		NTT(f,k,1),NTT(temp,k,1);
		for(int i=0;i<k;++i) f[i]=1ull*f[i]*((2-1ll*temp[i]*f[i]%p)%p+p)%p;
		NTT(f,k,-1);
		fill(f+t,f+k,0);
	}
	return;
}
inline void polyln(int*const a,int n){
	derivative(a,kk,n);
	polyinv(a,tmp,n);
	int t=1;
	while(t<(n<<1)) t<<=1;
	init(t);
	NTT(tmp,t,1),NTT(kk,t,1);
	for(int i=0;i<t;++i) tmp[i]=1ull*tmp[i]*kk[i]%p;
	NTT(tmp,t,-1);
	integrate(tmp,a,n);
	return;
}
inline void CDQ(int l,int r){
	if(l==r) return a[l]=1ull*a[l]*inv[l]%p,void();
	int mid=(l+r)>>1,len=1;
	CDQ(l,mid);
	for(;len<=r-(l<<1)+mid+1;len<<=1);
	memset(d,0,len<<2),memset(q,0,len<<2);
	memcpy(d,a+l,(mid-l+1)<<2),memcpy(q,g,(r-l+1)<<2);
	init(len);
	NTT(d,len,1),NTT(q,len,1);
	for(int i=0;i<len;++i) d[i]=1ull*d[i]*q[i]%p;
	NTT(d,len,-1);
	for(int i=mid+1;i<=r;++i) a[i]=(0ull+d[i-l]+a[i])%p;
	return CDQ(mid+1,r);
}
signed main(){
	cin.tie(nullptr)->sync_with_stdio(false);
	cin>>n>>k;
	for(int i=0;i<n;++i) cin>>f[i];
	for(char c:k) k1=((1ull*k1<<1)+(1ull*k1<<3)+(c&15))%p,k2=((1ull*k2<<1)+(1ull*k2<<3)+(c&15))%(p-1);
	for(ptr=0;ptr<n&&!f[ptr];++ptr);
	int invf=qpw(f[ptr],p-2);
	for(int i=ptr;i<n;++i) g[i-ptr]=1ull*invf*f[i]%p;
	a[0]=inv[0]=inv[1]=1;
	for(int i=2;i<=n;++i) inv[i]=1ll*(p-p/i)*inv[p%i]%p;
	polyln(g,n-ptr);
	for(int i=0;i<n-ptr;++i) g[i]=1ull*k1*i%p*g[i]%p;
	CDQ(0,n-ptr),invf=qpw(f[ptr],k2);
	for(int i=0;i<n-ptr;++i) g[i]=1ull*invf*a[i]%p;
	for(int i=0;i<1ull*ptr*k1%p;++i) cout<<0<<' ';
	for(int i=0;i<n-(1ll*ptr*k1%p);++i) cout<<g[i]<<' ';
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...