HDU4652:Dice

题面

传送门

题意

(m)面的骰子
求连续出现(n)个相同面的期望次数
或者
求连续出现(n)个不同面的期望次数

Sol

(f[i])表示已经出现了(i)~(n)这些面相同的期望次数
(g[i])(i)~(n)这些面不同的期望次数
那么显然有

[f[i]=frac{1}{m}f[i+1]+frac{m-1}{m}f[1]+1 ]

[f[n]=0 ]

[g[i]=frac{m-i}{m}g[i+1]+frac{1}{m}sum_{j=1}^ig[j]+1 ]

[g[n]=0 ]

然后差分一下即错位相减
就可以求出相邻两段的差值的关系
(f[1]-f[0]=1)(g[1]-g[0]=1)
就可以推出来所有的东西了

# include <bits/stdc++.h>
# define RG register
# define IL inline
# define Fill(a, b) memset(a, b, sizeof(a))
using namespace std;
typedef long long ll;

int T, op;
double n, m;

IL void Calc1(){
	RG double tp = 1, ans = 0;
	for(RG int i = 1; i <= n; ++i) ans += tp, tp *= m;
	printf("%.10lf
", ans);
}

IL void Calc2(){
	RG double tp = 1, ans = 0;
	for(RG int i = 1; i <= n; ++i) ans += tp, tp *= m / (m - i);
	printf("%.10lf
", ans);
}

int main(RG int argc, RG char *argv[]){
	while(scanf("%d", &T) != EOF){
		for(RG int i = 1; i <= T; ++i){
			scanf("%d%lf%lf", &op, &m, &n);
			!op ? Calc1() : Calc2();
		}
	}
    return 0;
}

原文地址:https://www.cnblogs.com/cjoieryl/p/8669665.html