QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#108537 | #4491. Find the Number of Paths | ko_RT_nya | TL | 0ms | 0kb | C++14 | 4.0kb | 2023-05-25 14:09:03 | 2023-05-25 14:09:04 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=4000004;
const ll mod=998244353;
ll f[maxn],h[maxn],g[maxn],a[maxn],b[maxn],c[maxn],d[maxn],st[maxn],pw[maxn],inv[maxn],T;
ll tr[maxn],n,m,k;
ll fpow(ll a,int x=mod-2){
if(x==0)return 1;
ll ans=1;
while(x){
if(x&1){
ans=ans*a%mod;
}
a=a*a%mod;
x>>=1;
}
return ans;
}
const ll G=3,invG=fpow(G,mod-2);
void NTT(ll *f,int n,int cur){
for(int i=0;i<n;i++){
tr[i]=(tr[i>>1]>>1)|((i&1)?n>>1:0);
}
for(int i=0;i<n;i++){
if(i<tr[i]){
swap(f[i],f[tr[i]]);
}
}
for(int p=2;p<=n;p<<=1){
int len=p>>1;
ll step=fpow(cur==1?G:invG,(mod-1)/p);
for(int i=0;i<n;i+=p){
ll suf=1;
for(int j=i;j<i+len;j++){
ll t=suf*f[len+j]%mod;
f[len+j]=((f[j]-t)%mod+mod)%mod;
f[j]=((f[j]+t)%mod+mod)%mod;
suf=step*suf%mod;
}
}
}
if(!cur){
ll invn=fpow(n,mod-2);
for(int i=0;i<n;i++){
f[i]=f[i]*invn%mod;
}
}
}
void dev(ll *f,ll *g,int len){
for(int i=1;i<len;i++) g[i-1]=i*f[i]%mod;
g[len-1]=0;
}
void invdev(ll *f,ll *g,int len){
for(int i=1;i<len;i++) g[i]=f[i-1]*fpow(i,mod-2)%mod;
g[0]=0;
}
void poly_inv(ll*f,ll*g,int n){
static ll temp[maxn];
if(n==1){
g[0]=fpow(f[0],mod-2);
return;
}
poly_inv(f,g,(n+1)>>1);
int len=1;
while(len<=n*2-1)len<<=1;
for(int i=0;i<len;i++){
tr[i]=(tr[i>>1]>>1)|((i&1)*(len>>1));
}
for(int i=0;i<n;i++){
temp[i]=f[i];
}
for(int i=n;i<len;i++){
temp[i]=0;
}
NTT(g,len,1),NTT(temp,len,1);
for(int i=0;i<len;i++)g[i]=((2ll-g[i]*temp[i]%mod)+mod)%mod*g[i]%mod;
NTT(g,len,0);
for(int i=n;i<len;i++){
g[i]=0;
}
}
void fln(ll *f,ll*g,int n){
dev(f,a,n);
poly_inv(f,b,n);
int lim=1,m=0;
while(lim<=n*2-1){
lim<<=1;
m++;
}
for(int i=1;i<lim;i++) tr[i]=(tr[i>>1]>>1)|((i&1)<<(m-1));
NTT(a,lim,1),NTT(b,lim,1);
for(int i=0;i<lim;i++){
a[i]=a[i]*b[i]%mod;
}
NTT(a,lim,0);
invdev(a,g,n);
}
void fexp(ll *f,ll*g,int n){
if(n==1){
g[0]=1;
return;
}
fexp(f,g,(n+1)>>1);
int lim=1,m=0;
while(lim<=n*2-1){
lim<<=1;
m++;
}
for(int i=1;i<lim;i++) tr[i]=(tr[i>>1]>>1)|((i&1)<<(m-1));
/*for(int i=0;i<(n<<1);i++){
c[i]=0;
}*/
memset(b,0,sizeof(b));
fln(g,c,n);
for(int i=0;i<n;i++){
d[i]=f[i];
}
NTT(g,lim,1),NTT(c,lim,1),NTT(d,lim,1);
for(int i=0;i<lim;i++){
g[i]=(1ll-c[i]+d[i]+mod)*g[i]%mod;
}
NTT(g,lim,0);
for(int i=n;i<lim;i++){
g[i]=0;
}
}
int main(){
inv[0]=pw[0]=1;
for(int i=1;i<maxn;i++){
pw[i]=pw[i-1]*i%mod;
inv[i]=fpow(pw[i]);
}
cin>>T;
while(T--){
for(int i=0;i<m;i++){
f[i]=g[i]=a[i]=b[i]=c[i]=d[i]=st[i]=h[i]=0;
}
cin>>n>>k;
for(int i=1;i<n;i++){
cin>>f[i];
}
m=n+k;
invdev(f,g,m);
memset(f,0,sizeof(f));
for(int i=0;i<m;i++){
g[i]=(g[i]*(mod-1))%mod;
}
fexp(g,f,m);
for(int i=0;i<m;i++){
h[i]=f[i];
}
memset(g,0,sizeof(g));
poly_inv(f,g,m+m);
for(int i=m;i>=0;i--){
if(i>=n-1){
g[i]=g[i-(n-1)];
}else{
g[i]=0;
}
}
for(int i=0;i<m;i++){
//cout<<i<<' '<<i+k-n+1<<' '<<g[i+k]<<' '<<pw[i+k]<<' ';
(st[i]=g[i+k]*pw[i+k]%mod*inv[i]%mod);
}
//cout<<'\n';
ll len=1;
while(len<=m+m-2){
len<<=1;
}
NTT(h,len,1);
/*for(int i=0;i<len;i++){
cout<<h[i]<<' ';
}
cout<<'\n';*/
NTT(st,len,1);
for(int i=0;i<len;i++){
st[i]=1ll*st[i]*h[i]%mod;
}
ll invn=fpow(len);
NTT(st,len,0);
for(int i=n-1;i>=0;i--){
cout<<st[i]%mod<<' ';
}
cout<<'\n';
}
return 0;
}/*
1
3 2
1 2
invdev:0 998244352 998244352
exp:1 998244352 499122176
st: 0 0 1
stto:0 0 1 998244352 499122186
sted:2 998244352*3*2 499122186*4*3
4 4
1 998244352 499122176 831870295 291154603
2 6 18 332748141 748683296
4 4
1 998244352 499122176 831870295 291154603
1 1 499122178 166374060 291154604
3 3
1 998244352 499122176 831870295
0 2 3 6
4
3 2
1 2
3 1
1 2
5 10
2 3 3 3
3 3
166374059 748683265
4
3 2
1 2
3 1
1 2
5 10
2 3 3 3
3 3
166374059 748683265
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Time Limit Exceeded
input:
14 3 2 1 2 3 1 1 2 7 10 1 1 4 5 1 4 2 1 998244352 18 32 1 0 1 0 1 0 0 0 0 1 1 1 0 0 0 0 1 188 19 633886818 153877981 415015507 40745200 269787796 274990221 297547338 934403707 463583160 490465672 641355195 897012511 641637182 821068661 614724038 55504516 717220803 796828809 578138752 516258420 ...
output:
5 0 2 409663694 257824498 842861758 224334521 645968612 986157727 546299091 253300863 813568900 291194609 0 1 207902489 101145501 645866265 720194951 906259454 68739848 275255384 890058004 37826824 622126996 133630353 237745816 635802715 576405348 174316543 217379036 889707599 68756671 79716426...