目录
显示
题目链接
题解
某年 NOIp 初赛题。
设 \(f(i)\) 表示从 \(1\) 到 \(i\) 的期望步数。边界是 \(f(1)=0\),当 \(i \geq 2\) 时,显然有如下递推式:
$$f(i)=1+\sum_{j=1}^{i} \frac{f_j}{n}$$
整理后可以得到:
$$f(i)=\begin{cases}0&,& i=1\\ \frac{1}{n-1}(n+\sum_{j=1}^{i-1} f_j)&,&i \geq 2\end{cases}$$
预处理逆元即可在 \(O(n)\) 的时间内解决。
#include <iostream> #define MOD 1000000007 using namespace std; int inv[10000005]; int main() { int n; cin>>n; inv[1]=1; for(int i=2;i<=n;i++) inv[i]=1ll*(MOD-MOD/i)*inv[MOD%i]%MOD; long long sum=0,f=0; for(int i=2;i<=n;i++) f=(1ll*i*inv[i-1]+1ll*sum*inv[i-1])%MOD,sum=(sum+f)%MOD; cout<<f<<endl; return 0; }