QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#764390#8049. Equal SumshotdogsellerTL 0ms104804kbC++142.1kb2024-11-20 08:56:032024-11-20 08:56:05

Judging History

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

  • [2024-11-20 08:56:05]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:104804kb
  • [2024-11-20 08:56:03]
  • 提交

answer

#include<bits/stdc++.h>

#define INF 1e18
#define int long long
#define maxn 505
#define mod 998244353 

using namespace std;

inline int read(){
	int lre=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		lre=(lre<<3)+(lre<<1)+(c-'0');
		c=getchar();
	}
	return lre*f;
} 

const int SUM=25000;

int n,m; 
int sum=0;
int L,R;
int dp[505][25005];//dp[前几个][最大和]
int dp2[505][25005];
//第二维前缀和化 

void show_dp(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=SUM;++j){
			cout<<dp[i][j]<<" "; 
		}
		cout<<endl;
	}
}

signed main(){
	
	n=read();m=read();
	dp[0][0]=1;
	for(int i=1;i<=SUM;i++){
		dp[0][i]=1;
	}
	for(int i=1;i<=n;i++){
		L=read(),R=read();
	//	cout<<"L="<<L<<" R="<<R<<endl; 
		for(int sum=L;sum<=SUM;sum++){
			if(sum>=R){
				dp[i][sum]+=(dp[i-1][sum-L]-dp[i-1][sum-R-1]+mod)%mod;
			}else{
				dp[i][sum]+=dp[i-1][sum-L]; 
			}
			dp[i][sum]%=mod;
		//	cout<<"dp["<<i<<"]["<<sum<<"]="<<dp[i][sum]<<endl;
		}
		for(int j=1;j<=SUM;j++){
			dp[i][j]+=dp[i][j-1];
		}
	}
//	show_dp();
	for(int i=1;i<=n;i++){
		for(int j=0;j<=SUM;j++){
			dp2[i][j]=dp[i][j];
		}
	}
	memset(dp,0,sizeof(dp));
	for(int i=0;i<=SUM;i++){
		dp[0][i]=1;
	}
	
	for(int i=1;i<=m;i++){
		L=read(),R=read();
	//	cout<<"L="<<L<<" R="<<R<<endl; 
		for(int sum=L;sum<=SUM;sum++){
			if(sum>=R){
				dp[i][sum]+=(dp[i-1][sum-L]-dp[i-1][sum-R-1]+mod)%mod;
			}else{
				dp[i][sum]+=dp[i-1][sum-L]; 
			}
			dp[i][sum]%=mod;
		//	cout<<"dp["<<i<<"]["<<sum<<"]="<<dp[i][sum]<<endl;
		}
		for(int j=1;j<=SUM;j++){
			dp[i][j]+=dp[i][j-1];
		}
	}
	
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
		//	cout<<"i="<<i<<" j="<<j<<endl; 
			int res=0;
			for(int sum=0;sum<=SUM;sum++){
			//	cout<<"sum="<<sum<<" ";
				res+=((dp2[i][sum]-dp2[i][sum-1])*(dp[j][sum]-dp[j][sum-1]))%mod;
			//	cout<<"dp1="<<dp2[i][sum]-dp2[i][sum-1]<<" dp2="<<dp[j][sum]-dp[j][sum]<<endl; 
				res%=mod;
			} 
			printf("%lld ",res);
		}
		putchar('\n');
	} 
	
	return 0;
}
/*
Σx[i]=b
n

非负数解的数量是:C(n+b-1,b)
*/ 

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 104804kb

input:

2 3
1 2
2 3
1 4
2 2
1 3

output:

2 0 0 
3 4 4 

result:

ok 6 numbers

Test #2:

score: -100
Time Limit Exceeded

input:

500 500
19 458
1 480
7 485
50 461
12 476
15 461
48 466
40 453
46 467
9 458
27 478
26 472
46 459
29 490
6 500
17 487
48 484
28 472
28 459
25 480
4 491
29 481
36 460
2 491
44 499
22 473
20 458
4 483
27 471
2 496
11 461
43 450
2 478
37 466
15 459
42 482
7 451
19 455
2 453
47 475
48 450
1 474
46 471
9 4...

output:

411 79401 9145270 673005095 180581065 984223118 586589234 293043270 404363796 865361724 665487988 118838806 926189944 226338288 521479857 808644951 786041288 340769021 177100 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

result: