社区讨论

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 条回复,欢迎继续交流。

正在加载回复...