P10514 考试
题目背景
人生有梦,各自精彩。
题目描述
有 n n n 名同学去参加考试,考试有 m m m 道题。
每个学生的实力是相同的,但是每道题的难度可能不同。第 i i i 道题会有随机的 a i a_i ai 名同学做错。
考试结束后,随机选出 k k k 名同学,求出这些同学全部做对的概率。答案对 998244353 998244353 998244353 取模。
输入格式
第一行三个整数 n , m , k n,m,k n,m,k。
第二行 m m m 个整数,第 i i i 个数表示 a i a_i ai。
输出格式
一个整数,表示答案取模后的结果。
输入输出样例 #1
输入 #1
5 5 2
1 2 1 2 2
输出 #1
793364682
说明/提示
【样例解释】
随机选出 2 2 2 名同学全部做对的概率为 243 25000 \frac{243}{25000} 25000243,对 998244353 998244353 998244353 取模后答案为 793364682 793364682 793364682。
可以证明答案一定为有理数。若不了解有理数取模,可以参照【模板】有理数取余。
【数据范围】
- 对于 30 % 30\% 30% 的数据, 1 ≤ n , m ≤ 10 1\leq n,m \leq 10 1≤n,m≤10;
- 另外有 10 % 10\% 10% 的数据, k = 0 k=0 k=0;
- 另外有 20 % 20\% 20% 的数据, 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1≤n≤1000, 1 ≤ m ≤ 10 5 1\leq m \leq 10^5 1≤m≤105;
对于所有数据,保证 1 ≤ n , m ≤ 10 5 1\leq n,m\leq 10^5 1≤n,m≤105, 0 ≤ k , a i ≤ n 0\leq k,a_i\leq n 0≤k,ai≤n。
C++实现
#include<iostream>
using namespace std;
#define int long long
const int mod=998244353;
int n,m,k,a[(int)1e5+5],pre[(int)1e5+5],ans=1;
int qpow(int a,int b){
if(b==0) return 1;
if(b==1) return a;
if(b&1) return a*qpow(a,b-1)%mod;
else{
int tmp=qpow(a,b>>1);
return tmp*tmp%mod;
}
}
inline int c(int a,int b){
if(a<b) return 0;
else return pre[a]*qpow(pre[a-b],mod-2)%mod*qpow(pre[b],mod-2)%mod;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=m;i++) cin>>a[i];
pre[0]=1;
for(int i=1;i<=n;i++) pre[i]=pre[i-1]*i%mod;
for(int i=1;i<=m;i++){
ans*=c(n-k,a[i])*qpow(c(n,a[i]),mod-2)%mod;
ans%=mod;
}
cout<<ans;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥题 P10514 考试&spm=1001.2101.3001.5002&articleId=163119984&d=1&t=3&u=cbc898752f414535a55513957171793f)
5477

被折叠的 条评论
为什么被折叠?



