首页 > 其他 > 详细

BZOJ 5369: [Pkusc2018]最大前缀和

时间:2018-10-29 11:43:25      阅读:159      评论:0      收藏:0      [点我收藏+]

状压最大前缀和由哪些数组成,保证最大前缀和合法

#include<cstdio>
using namespace std;
const int mod=998244353;
int a[25],F[1200005],G[1200005];
int main(){
	int n;
	scanf("%d",&n);
	for (int i=0; i<n; i++) scanf("%d",&a[i]);
	int Max=(1<<n)-1;
	for (int i=0; i<n; i++) F[1<<i]=1;
	for (int i=0; i<(1<<n); i++){
		long long Sum=0;
		for (int j=0; j<n; j++) if (i&(1<<j)) Sum+=a[j];
		for (int j=0; j<n; j++) if (!(i&(1<<j)) && Sum>0) (F[i|(1<<j)]+=F[i])%=mod;
	}
	G[0]=1;
	for (int i=0; i<(1<<n); i++){
		long long Sum=0;
		for (int j=0; j<n; j++) if (i&(1<<j)) Sum+=a[j];
		for (int j=0; j<n; j++) if (!(i&(1<<j)) && Sum<=0 && Sum+a[j]<=0) (G[i|(1<<j)]+=G[i])%=mod;
	}
	int ans=0;
	for (int i=1; i<(1<<n); i++){
		long long Sum=0;
		for (int j=0; j<n; j++) if (i&(1<<j)) Sum+=a[j];
		Sum%=mod;
		(Sum+=mod)%=mod;
		(ans+=Sum%mod*F[i]%mod*G[Max^i]%mod)%=mod;
	}
	printf("%d\n",ans);
	return 0;
}

  

BZOJ 5369: [Pkusc2018]最大前缀和

原文:https://www.cnblogs.com/silenty/p/9869736.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!