biubiubiu坐地铁 期望dp

链接:https://ac.nowcoder.com/acm/contest/642/M
来源:牛客网
 

题目描述

BiuBiuBiu 每次出去玩都要去坐地铁,BiuBiuBiu 观察到,当地铁上人比较少的时候,大家都会选择那些与其他人不相邻的座位,现在地铁上有 n 个座位排成一排,1 号座位与 2 号相邻,n 号座位与 n-1 号相邻,除了 1 号与 n 号座位,任意 i 号座位都与 i-1 和 i+1 号座位相邻。现在有源源不断的人上车,每次只会有一个人上车,他会在所有的相邻座位没有人的座位中随机选择一个坐下,如果没有满足条件的座位则不会坐下。然后下一个人上车。求最后这辆地铁坐下的人数的期望。

输入描述:

输入一个整数n(1<=n<=1000000)。

输出描述:

能够证明期望是个分数,所以输出期望模1000000007。

示例1

输入

复制

3

输出

复制

666666673

题解:对于有n个位置的情况,第一次选有n种选择,选择第一个位置,剩下的就是f[n-2],选择第二个,剩下的是f[n-3]+f[0],选择第三个,剩下的是f[n-4]+f[1]...以此类推,结果就是n种情况,一共为n+2(f[n-2]+f[n-1]..),保存一下前n-2的前缀和即可

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll f[1000100];
int n;
ll ksm(ll x,ll y)
{
	ll res=1;
	while(y)
	{
		if(y&1) res=res*x%mod;
		y>>=1;
		x=x*x%mod;
	}
	return res;
}
int main()
{
	
	f[1]=1;f[2]=1;
	ll cnt=1;
	for(int i=3;i<=1000000;i++)
	{
		f[i]=(i+2*cnt)*ksm(i,mod-2)%mod;
		cnt+=f[i-1];
		cnt%=mod;
	}
//	cout<<cnt<<endl;
	while(~scanf("%d",&n)) printf("%lld\n",f[n]);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/mmk27_word/article/details/89433181