結果
| 問題 | No.1963 Subset Mex |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-12-23 16:01:08 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 6 ms / 4,000 ms |
| コード長 | 1,775 bytes |
| 記録 | |
| コンパイル時間 | 3,543 ms |
| コンパイル使用メモリ | 280,344 KB |
| 実行使用メモリ | 8,624 KB |
| 最終ジャッジ日時 | 2025-12-23 16:01:13 |
| 合計ジャッジ時間 | 4,115 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 26 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,xn=105,xd=120;
int T,s,a[xn],d,b[xd],dp[xd][xn][xn],ans,pd[xd][xn];
template<typename T>inline void read(T &n){
T w=1;n=0;char ch=getchar();
while(!isdigit(ch)&&ch!=EOF){if(ch=='-')w=-1;ch=getchar();}
while(isdigit(ch)&&ch!=EOF)n=(n<<1)+(n<<3)+(ch&15),ch=getchar();
n*=w;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
T=1;
while(T--){
read(s),d=0;for(int g=1;g<=s;g++)read(a[g]),d=max(d,a[g]);d+=10;
for(int g=0;g<=d;g++)b[g]=0;for(int g=1;g<=s;g++)b[a[g]]++;
for(int g=0;g<=d+1;g++)for(int h=0;h<=s;h++)for(int j=0;j<=s;j++)dp[g][h][j]=0;dp[d+1][0][0]=1;
for(int g=d;g;g--)for(int h=0;h*(g+1)<=s;h++)for(int j=0;j<=s;j++)if(dp[g+1][h][j])
for(int v=0;v+h<=b[g]||(v+2*h-b[g])*g<=s-b[g];v++){
int e=max(h,v+2*h-b[g]),r=j+max(b[g]-v-h,0);
dp[g][e][r]=(dp[g][e][r]+dp[g+1][h][j])%mod;
}
ans=0;
for(int h=0;h<=s;h++)for(int j=0;j<=s;j++)if(dp[1][h][j]&&j+b[0]>=h){
int e=j+b[0]-h;ans=(ans+1ll*(e+1)*dp[1][h][j])%mod;
}
for(int g=0;g<=d+1;g++)for(int h=0;h<=s;h++)pd[g][h]=0;pd[d+1][0]=1;int ki=0;
for(int g=d;g>=0;g--){
for(int h=ki;h>=0;h--)for(int j=0;j<=b[g];j++)pd[g][h+j]=(pd[g][h+j]+pd[g+1][h])%mod;
ki+=b[g];
}
int kp=0,kl=b[0];
for(int g=1;g<=d;g++){
if(b[g]){
int kk=0;int lo=1,lp=0;bool t=1;
for(int h=g-1;h;h--){
lp+=max(0,b[h]-lo);
lo=max(lo,lo+lo-b[h]);
if(lo>=10*s){t=0;break;}
}
if(t){
lp+=b[0];
int e=s-kl+1+lp-lo;
for(int h=0;h<=min(e,s);h++)kk=(1ll*kk+pd[g][h]+mod-pd[g+1][h])%mod;kp=(kp+kk)%mod;
}
}
kl+=b[g];
}
int ko=1;for(int g=1;g<=d;g++)ko=1ll*ko*(b[g]+1)%mod;
if(!b[0]&&!b[1])kp=(kp+1)%mod;ans=(1ll*ans+kp+mod-ko)%mod;
cout<<ans<<'\n';
}
return 0;
}
vjudge1