社区讨论
4分求助,帮助必关
P14364[CSP-S 2025] 员工招聘参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mm2uzaa1
- 此快照首次捕获于
- 2026/02/26 10:43 2 周前
- 此快照最后确认于
- 2026/02/26 14:16 2 周前
样例都输出0,还能拿4分(那个点答案肯定是0)
代码
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=505,M=998244353;
int n,m,c,cnt[N],pre[N],dp[2][N][N],ans;
string ss;
bool s[N];
int jc[N],ny[N],C[N][N];
void init(){
jc[0]=1;
for(int i=1;i<N;i++)jc[i]=jc[i-1]*i%M;
ny[0]=ny[1]=1;
for(int i=2;i<N;i++)ny[i]=(M-M/i)*ny[M%i]%M;
for(int i=2;i<N;i++)ny[i]=ny[i]*ny[i-1]%M;
for(int i=0;i<N;i++){
for(int j=0;j<=i;j++){
C[j][i]=jc[i]*ny[i-j]%M*ny[j]%M;
}
}
}
signed main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
init();
cin>>n>>m>>ss;
for(int i=1;i<=n;i++)s[i]=ss[i-1]-'0';
for(int i=1;i<=n;i++){
cin>>c;
cnt[c]++;
}
pre[0]=cnt[0];
for(int i=1;i<=n;i++)pre[i]=pre[i-1]+cnt[i];
dp[0][0][0]=1;
for(int ii=0;ii<n;ii++){
bool i=ii&1;
for(int j=0;j<=n;j++)
for(int k=0;k<=n;k++)
dp[!i][j][k]=0;
for(int j=0;j<=i;j++){
for(int k=0;k<=pre[j];k++){
if(s[ii+1]){
if(i-k<n-pre[j]){
dp[!i][j][k]=(dp[!i][j][k]+dp[i][j][k])%M;
}
int com=dp[i][j][k]*(pre[j]-k)%M;
for(int x=0;x<=min(cnt[j+1],i-k);x++){
dp[!i][j+1][k+x+1]=(com*C[x][i-k]%M*C[x][cnt[j+1]]%M*jc[x]%M+dp[!i][j+1][k+x+1])%M;
}
}else{
for(int x=0;x<=min(cnt[j+1],i-k);x++){
int com=dp[i][j][k]*C[x][i-k]%M*C[x][cnt[j+1]]%M*jc[x]%M;
dp[!i][j+1][k+x+1]=(com*(pre[j+1]-k-x)%M+dp[!i][j+1][k+x+1])%M;
if(n-pre[j+1]>i-k-x){
dp[!i][j+1][k+x]=(com+dp[!i][j+1][k+x])%M;
}
}
}
}
}
}
for(int i=0;i<=n-m;i++){
ans=(ans+dp[n&1][i][pre[i]]*jc[n-pre[i]]%M)%M;
}
cout<<ans;
return 0;
}
求求了,help me!
回复
共 0 条回复,欢迎继续交流。
正在加载回复...