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\n", 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\n", 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;
}

posted @ 2018-03-29 14:32  Cyhlnj  阅读(165)  评论(0编辑  收藏  举报