[PA 2026] 骰子 / Kostki

[PA 2026] 骰子 / Kostki

考虑对于这类期望相关的题目,统一转成概率来计算。


首先我们令 \(f_i\) 表示一个人从 \(0\) 开始掷骰子,能够掷到 \(i\) 的概率。

显然 \(f_0 = 1\),且有递推:

\[f_i = \dfrac{1}{k} \times \sum\limits_{j=1}^{\min(k,i)} f_{i-j} \]

具体含义即考察 \(i\) 的来源,容易使用前缀和优化转移。


接下来令 \(c_i\) 表示一个人在得分为 \(i\) 时,有多少种结果会结束游戏。

这里不考虑 \(i \geq m\) 的情况,显然 \(c_i = \max(0,i+k-m+1)\)。

也就是说,从分数 \(i\) 投掷一次获胜的概率 \(p_i = \dfrac{c_i}{k}\)。

同时定义 \(q_i\) 表示玩家从 \(i\) 投掷结束游戏的概率,显然 \(q_i=f_i \times p_i\)。

令 \(r_i = \sum\limits_{j=i}^{m-1} q_i\),即从 \(\geq i\) 的数投掷结束游戏的概率。


考虑游戏的过程,本质上是一层层的考虑分数,将所有 \(=x\) 的人进行投掷。

游戏在 \(=i\) 的层结束,当且仅当所有人都能达到分数 \(i\),且存在 \(i\)。

此时的概率也就是 \(s_i = r_{i}^n - r_{i+1}^n\)。

考虑到此时投掷一次结束的概率是 \(p_i\),则期望要投掷 \(\dfrac{1}{p_i}\) 次。

也就是说,\(i\) 的贡献为:

\[a_i = \begin{cases} n \times f_i & c_i = 0 \\ \dfrac{s_i}{p_i} & c_i > 0 \end{cases} \]

答案即 \(\sum\limits_{i=0}^{m-1} a_i\)。

//Ad astra per aspera
#include<iostream>
#include<cstdio>
using namespace std;
long long mod=1000000007;
long long pow_mod(long long num1,long long num2){
	num1=(num1%mod+mod)%mod;
	num2=(num2%(mod-1)+(mod-1))%(mod-1);
	long long num3=1;
	while(num2){
		if(num2&1){
			num3=num3*num1%mod;
		}
		num1=num1*num1%mod;
		num2>>=1;
	}
	return num3;
}
long long f[1000010];
long long sum[1000010];
long long c[1000010];
long long p[1000010];
long long q[1000010];
long long r[1000010];
long long s[1000010];
long long query(int l,int r){
	long long ans=sum[r];
	if(l){
		ans=((ans-sum[l-1])%mod+mod)%mod;
	}
	return ans; 
}
int main(){
	int n,k,m;
	scanf("%d %d %d",&n,&k,&m);
	f[0]=sum[0]=1;
	for(int i=1;i<m;i++){
		f[i]=query(max(0,i-k),i-1)*pow_mod(k,-1)%mod;
		sum[i]=(sum[i-1]+f[i])%mod;
	}
	for(int i=0;i<m;i++){
		c[i]=max(0,i+k-m+1);
		p[i]=c[i]*pow_mod(k,-1)%mod;
		q[i]=f[i]*p[i]%mod;
	}
	for(int i=m-1;i>=0;i--){
		r[i]=(r[i+1]+q[i])%mod;
		s[i]=((pow_mod(r[i],n)-pow_mod(r[i+1],n))%mod+mod)%mod;
	}
	long long ans=0;
	for(int i=0;i<m;i++){
		if(c[i]==0){
			ans+=n*f[i]%mod;
			ans%=mod;
		}
		else{
			ans+=s[i]*pow_mod(p[i],-1)%mod;
			ans%=mod;
		}
	}
	printf("%lld",ans);
	return 0;
}
posted @ 2026-05-12 22:05  Oken喵~  阅读(24)  评论(0)    收藏  举报