| 比赛 |
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;
}