比赛 2026.5.16 评测结果 AAAAAAAAAA
题目名称 Divide 最终得分 100
用户昵称 VTXE 运行时间 0.162 s
代码语言 C++ 内存使用 3.81 MiB
提交时间 2026-05-16 11:36:54
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define ll long long

const ll mod=1e9+7;

ll mpow(ll aa,ll bb){
	ll res=1;
	aa%=mod;
	while (bb){
		if (bb%2) res=(res*aa)%mod;
		aa=(aa*aa)%mod;
		bb>>=1;
	}
	return res%mod;
}

ll n,m;
ll w[2100];
ll l[2100],r[2100],cnt1,cnt2;
ll c[2100];
ll f[2100],wa[2100],f2[2100],wa2[2100];
ll ans1=-1,ans2;

int main(){
	freopen("divide.in","r",stdin);
	freopen("divide.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for (int i=0;i<n;i++){
		cin>>w[i];
	}
	for (int i=0;i<=n;i++){
		f[i]=-1;
	}
	for (int i=0;i<n;i++){
		if (w[i]*2<m){
			l[cnt1++]=w[i];
		}else{
			r[cnt2++]=w[i];
		}
	}
	sort(r,r+cnt2);
	for (int i=0;i<cnt1;i++){
		ll x=m-l[i];
		auto it=lower_bound(r,r+cnt2,x);
		ll t=r+cnt2-it;
		c[t]++;
	}
	f[0]=0;
	wa[0]=1;
	for (int i=1;i<=cnt2;i++){
		for (int j=0;j<=n;j++){
			f2[j]=-1;wa2[j]=0;
		}
		ll nm=mpow(2,c[i]);
		for (int j=0;j<=i;j++){
			ll maxn=-1,mwa=0;
			if (j!=i&&f[j]!=-1){
				ll xx=f[j]+c[i]*max(j,i-j);
				if (xx>maxn){
					maxn=xx;
					mwa=wa[j];
				}else if (xx==maxn){
					mwa=(mwa+wa[j])%mod;
				}
			}
			if (j-1>=0&&f[j-1]!=-1){
				ll xx=f[j-1]+c[i]*max(j,i-j);
				if (xx>maxn){
					maxn=xx;
					mwa=wa[j-1];
				}else if (xx==maxn){
					mwa=(mwa+wa[j-1])%mod;
				}
			}
			f2[j]=maxn;
			if (f2[j]!=-1){
				if (2*j==i){
					mwa=nm*mwa%mod;
				}
				wa2[j]=mwa;
			}
		}
		for (int j=0;j<=n;j++){
			f[j]=f2[j];
			wa[j]=wa2[j];
		}
	}
	for (int j=0;j<=cnt2;j++){
		if (f[j]!=-1){
			ll xx=f[j]+j*(cnt2-j);
			if (xx>ans1){
				ans1=xx;
				ans2=wa[j];
			}else if (xx==ans1){
				ans2=(ans2+wa[j])%mod;
			}
		}
	}
	ans2=(ans2*mpow(2,c[0]))%mod;
	cout<<ans1<<" "<<ans2<<'\n';
	return 0;
}