ZOJ3415 Zhou Yu(期望推式子)
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZOJ3415 Zhou Yu(期望推式子)相关的知识,希望对你有一定的参考价值。
定义 f [ i ] f[i] f[i]是 i i i到 i − 1 i-1 i−1的期望
f [ n ] = 1 m ( 1 + f [ n ] ) + m − 1 m f[n]=\\frac1m(1+f[n])+\\fracm-1m f[n]=m1(1+f[n])+mm−1
那么 f [ n ] = m m − 1 f[n]=\\fracmm-1 f[n]=m−1m
且 f [ i ] = 1 m ∗ ( f [ i ] + f [ i + 1 ] ) + 1 f[i]=\\frac1m*(f[i]+f[i+1])+1 f[i]=m1∗(f[i]+f[i+1])+1
m − 1 m ∗ f [ i ] = 1 m ∗ f [ i + 1 ] + 1 \\fracm-1m*f[i]=\\frac1m*f[i+1]+1 mm−1∗f[i]=m1∗f[i+1]+1
化简得到
f [ i ] = 1 m − 1 ∗ f [ i + 1 ] + m m − 1 f[i]=\\frac1m-1*f[i+1]+\\fracmm-1 f[i]=m−11∗f[i+1]+m−1m
这样可以在线性的时间开始递推,但是仍然不够优秀
我们再用迭代的方式进去
f [ i ] = m m − 1 + m ( m − 1 ) 2 + . . . m ( m − 1 ) n − i + 1 f[i]=\\fracmm-1+\\fracm(m-1)^2+...\\fracm(m-1)^n-i+1 f[i]=m−1m+(m−1)2m+...(m−1)n−i+1m
就是求这个东西 ∑ i = 1 n f [ i ] \\sum\\limits_i=1^nf[i] i=1∑nf[i]
那么定义 g [ i ] = m m − 1 + m ( m − 1 ) 2 + . . . m ( m − 1 ) i g[i]=\\fracmm-1+\\fracm(m-1)^2+...\\fracm(m-1)^i g[i]=m−1m+(m−1)2m+...(m−1)im
那么有 ∑ i = 1 n g [ i ] = ∑ i = 1 n f [ i ] \\sum\\limits_i=1^ng[i]=\\sum\\limits_i=1^nf[i] i=1∑ng[i]=i=1∑nf[i]
q = 1 m − 1 g i = m q ( 1 − q i ) 1 − q ∑ i = 1 n g i = m q 1 − q ∗ ( ∑ i = 1 n 1 − ∑ i = 1 n q i ) = m q 1 − q ∗ ( n − q ∗ ( 1 − q n ) 1 − q ) q = \\frac1m - 1\\\\ g_i=\\fracmq(1-q^i)1-q\\\\ \\sum\\limits_i=1^ng_i=\\fracmq1-q*(\\sum\\limits_i=1^n1-\\sum\\limits_i=1^nq^i)\\\\ =\\fracmq1-q*(n-\\fracq*(1-q^n)1-q) q=m−11gi=1−qmq(1−qi)i=1∑ngi=1−qmq∗(i=1∑n1−i=1∑nqi)=1−qmq∗(n−1−qq∗(1−qn))
于是开始在log的时间内求解
#include <bits/stdc++.h>
using namespace std;
int n,m;
double quick(double x,int n )
double ans = 1;
while( n )
if( n&1 ) ans = ans*x;
x = x*x; n>>=1;
return ans;
int main()
while( cin >> n >> m )
if(m == 2)
printf("%.10lf\\n", 1.0 * n * (n+1));
continue;
double q = 1.0/(m-1);
double power = q*( quick(q,n)-1 )/(q-1 )-n;
double ans = power * m * q / (q-1);
printf("%.8lf\\n",ans);
以上是关于ZOJ3415 Zhou Yu(期望推式子)的主要内容,如果未能解决你的问题,请参考以下文章