题面
题意
(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;
}