QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#108559#4491. Find the Number of Pathsko_RT_nyaAC ✓7913ms112628kbC++144.1kb2023-05-25 14:54:412023-05-25 14:54:43

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:54:43]
  • 评测
  • 测评结果:AC
  • 用时:7913ms
  • 内存:112628kb
  • [2023-05-25 14:54:41]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1600004;
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,len;
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++){
		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(){
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	inv[0]=pw[0]=1;
	for(int i=1;i<maxn/4;i++){
		pw[i]=pw[i-1]*i%mod;
		inv[i]=fpow(pw[i]);
	}
	cin>>T;
	while(T--){
		for(int i=0;i<len;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);
		for(int i=0;i<m;i++){
			f[i]=0;
		}
		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];
		}
		for(int i=0;i<m;i++){
			g[i]=0;
		}
		poly_inv(f,g,m);
		for(int i=0;i<m;i++){
				//cout<<i<<' '<<i+k-n+1<<' '<<g[i+k]<<' '<<pw[i+k]<<' ';
				(st[i]=g[i+k-n+1]*pw[i+k]%mod*inv[i]%mod);
		}
		//cout<<'\n';
		len=1;
		while(len<=m+m-2){
			len<<=1;
		}
		for(int i=0;i<len;i++){
			tr[i]=(tr[i>>1]>>1)|((i&1)?len>>1:0);
		}
		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: 100
Accepted
time: 7913ms
memory: 112628kb

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 
0 2 0 
475251424 113315999 791330691 478266847 175921200 46569600 4082400 
0 1 
290297689 111948457 905336170 325091865 481715174 560516169 711953201 909617930 834449213 230629315 299970170 870572449 496138561 512305244 580683156 556935218 282162750 458443581 
900977301 704879246 103685386 11...

result:

ok 14 lines