社区讨论
蒟蒻刚学 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 条回复,欢迎继续交流。
正在加载回复...