QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#108537#4491. Find the Number of Pathsko_RT_nyaTL 0ms0kbC++144.0kb2023-05-25 14:09:032023-05-25 14:09:04

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-25 14:09:04]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2023-05-25 14:09:03]
  • 提交

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
*/

詳細信息

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...

result: