80pts TLE 求调
查看原帖
80pts TLE 求调
202481
yan!楼主2024/8/16 10:16
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int P=998244353;
int l[5010],r[5010];
int p[5010];
int f[5010][5010];
int g[5010];
int ans[5010];
int inv[5010];
int add(int x,int y){
	int z=x+y;
	if(z>=P)z-=P;
	return z;
}
int del(int x,int y){
	int z=x-y;
	if(z<0)z+=P;
	return z;
}
int mul(int x,int y){
	long long z=1ll*x*y;
	if(z>=P)z%=P;
	return z;
}
int qpow(int x,int y){
	int g=1;
	while(y){
		if(y&1)g=mul(g,x);
		x=mul(x,x),y>>=1;
	}return g;
}
int main(){
	scanf("%d",&n);inv[1]=1;
	for(int i=2;i<=n;++i)inv[i]=mul((P-P/i),inv[P%i]);
	for(int i=2;i<=n;++i){
		scanf("%d%d",&l[i],&r[i]);
		p[i]=inv[r[i]-l[i]+1];
	}
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j){
//			f[i][j]=((g[r[j]]-g[l[j]-1])%P+P)%P*p[j]%P;
			f[i][j]=mul(del(g[r[j]],g[l[j]-1]),p[j]);
			if(j==i)f[i][j]=1;
//			s[j]=(s[j-1]+f[i][j])%P;
			g[j]=add(g[j-1],f[i][j]);
		}
	scanf("%d",&m);
	for(int i=1;i<=n;++i)
		g[i]=0;
	for(int i=1;i<=m;++i){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		w=add(w,0);
		for(int j=n;j>=1;--j){
//			g[j]=(g[j]+f[j][u]*f[j][v]%P*w%P)%P;
			g[j]=add(g[j],mul(mul(f[j][u],f[j][v]),w));
//			ans[j]=(ans[j]+(f[j][u]+f[j][v])%P*w%P)%P;
			ans[j]=add(ans[j],mul(add(f[j][u],f[j][v]),w));
		}
	}
	for(int i=n;i>=1;--i)
		for(int j=1;j<i;++j)
//			g[j]=((g[j]-g[i]*f[j][i]%P*f[j][i]%P)%P+P)%P;
			g[j]=del(g[j],mul(g[i],mul(f[j][i],f[j][i])));
	for(int i=2;i<=n;++i)
		for(int j=1;j<=n;++j)
//			ans[i]=((ans[i]-g[j]*f[i][j]%P*2%P)%P+P)%P;
			ans[i]=del(ans[i],mul(mul(g[j],f[i][j]),2));
	for(int i=2;i<=n;++i)
		printf("%d ",ans[i]);
	return 0;
}
2024/8/16 10:16
加载中...