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;
}
标签:biubiubiu,坐地铁,int,res,ll,相邻,座位,dp,mod 来源: https://blog.csdn.net/mmk27_word/article/details/89433181