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;
}