B3718
题目分析
50 分做法
一道较为简单的概率题。
第一眼看到这个问题,应该很容易想到用到古典概型公式:
P(A)=\frac{x}{y}
其中
这道题中
于是问题变为如何求
这时再来看
恰好有
“恰好”启发着我们用加法(或分类)原理来计算方案数,因为这样做我们大概率不需要容斥。
于是就可以想到这题的正解了!!
如果已经有
x=C_{n}^{m}5^{n-m}
把组合数拆开后,就得到
P(A)=\frac{5^{n-m}n!}{6^{n}m!(n-m)!}
由于还要模
#include<bits/stdc++.h>
using namespace std;
#define ull unsigned long long
#define ll long long
#define ci const int
ci mod=998244353;
ci N=5e6+5;
ll inv[N],mul[N],ans,mul5[N],inv6[N];
int t;
ll qp(ll a,ll b){
if(b==0)rt 1;
ll c=qp(a,b/2);
c=c*c%mod;
if(b&1)c=c*a%mod;
return c;
}
void preset(){//预处理
mul[0]=mul5[0]=1;
for(int i=1;i<=N-5;i++){
mul[i]=mul[i-1]*i%mod;
mul5[i]=mul5[i-1]*5%mod;
}
inv[N-5]=qp(mul[N-5],mod-2);
inv6[N-5]=qp(qp(6,N-5),mod-2);
for(int i=N-6;i>=0;i--){
inv[i]=inv[i+1]*(i+1)%mod;
inv6[i]=inv6[i+1]*6%mod;
}
}
int main(){
cin >>t;
preset();
for(int i=1,n,m;i<=t;i++){
scanf("%d%d",&n,&m);
ans^=mul5[n-m]*mul[n]%mod*inv6[n]%mod*inv[m]%mod*inv[n-m]%mod;
}
cout <<ans;
return 0;
}
什么,你做完了?!提交了代码然后……WA了?!
你这时回去看输入输出格式,发现:
共输出两行。
第一行输出一个仅含小写字母的字符串,表示『骰』这个字的汉语拼音(不含声调)。
啊啊啊这是什么鬼?NOI 大纲里好像没有这方面的知识啊?
这个对于只会敲代码的 OIer 们来讲超纲了,因为 NOI 大纲里根本没有认识某些汉字的拼音这项知识。
由于接下来的内容有些超纲,只想练习敲代码的 OIer 们可以选择拿到
满分做法
在
这里介绍两个新的概念: