ZCMU—2157

2157: K.ly的旅行计划

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 11  Solved: 3
[Submit][Status][Web Board]

Description

马上就要放暑假了,ly开始准备她的假期旅行计划,她买了一辆很神奇的火车的车票,假设把这辆火车的路线看成一条X轴,ly会在0的位置上车,然后开始她的旅行。这辆神奇的火车有一个神奇的行进规则,当它位于坐标X时,每天它有1/4的概率移动到(X+1),有1/4的概率移动到(X-1),还有1/2的概率会在原地多停一天。
而wjw作为ly的好朋友,当然是希望和ly一起出去玩,但是wjw需要先回家一趟,所以wjw会在坐标点为M的地方等ly,ly现在想知道,她有多大的概率在第N天的时候到达M点见到wjw
显然答案可以被表示成A/B,(A,B互质),并且Q不能被1000000007整除,请输出A(B^-1) mod 1000000007的结果,(B^-1)是B的乘法倒数模1000000007

Input

多组数据,第一行包含一个正整数T(T<=10)
然后每行有两个正整数N,M(0<=n,|M|<=100000),如题意

Output

对每组N,M输出结果

Sample Input

2
2 -2
0 0

Sample Output

562500004
1

【分析】

求从0点向m走i步那么就得返回i-m步最后原地停留了n+m-2*i步

所以答案就是c[n][i]*c[n-i][i-m]*A*B*C

A,B,C分别表示走了i步,i-m步,n+m-2*i步的概率C[n][i] = n!/i!/(n-i)!

然后枚举所有i的可能性,然后记得逆元...没啥别的问题

【代码】

#include<algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include  <stdio.h>
#include   <math.h>
#include   <time.h>
#include   <vector>
#include   <bitset>
#include    <queue>
#include      <set>
#include      <map>
using namespace std;
 
typedef long long LL;
const int Mod=1e9+7,N=200005;
 
int Pow(int a,int b)
{
    int c=1;
    while(b)
    {
        if(b&1)
            c=c*(LL)a%Mod;
        a=a*(LL)a%Mod;b>>=1;
    }
    return c;
}
 
int fac[N];
 
 
int C(int n,int m)
{
    if(m<0||m>n)
        return 0;
    return fac[n]*(LL)Pow(fac[m],Mod-2)%Mod*Pow(fac[n-m],Mod-2)%Mod;
}
 
void solve()
{
    int t,p;scanf("%d%d",&t,&p);
    if(p<0)
        p=-p;
    cout<<C(2*t,t-p)*(LL)Pow(Mod+1>>1,2*t)%Mod<<endl;
}
 
int main()
{
// #ifndef ONLINE_JUDGE
    //freopen("5.in","r",stdin);
    //freopen("5.out","w",stdout);
// #endif
    fac[0]=1;
    for(int i=1;i<N;i++)
        fac[i]=fac[i-1]*(LL)i%Mod;
    int T;cin>>T;
    while(T--)
        solve();
    return 0;
}

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnxxhzz/article/details/80691698
个人分类: zcmu acm
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭