【ZCMU2157】ly的旅行计划(组合)

题目链接

2157: K.ly的旅行计划

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 38  Solved: 12
[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

HINT

 

Source

jnxxhzz

 

【解题思路】

从原点开始走到M点,假设在n天中有i天是往前走的,那么就有i-m天是往回走的,n-2i+m天是停留在原地的。

所以在这n天中i天向前走的方案数为C(n,i),向后走的方案数为C(n-i,i-m),停留在原地的方案数为C(n-2i+m,n-2i+m),所以总的概率为C(n,i)*(1/4)^i*C(n-i,i-m)*(1/4)^(i-m)*C(n-2i+m,n-2i+m)*(1/2)^(n-2i+m)。再枚举i把所有的概率相加。

【代码】

#include
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const int mod=1e9+7;
LL f[maxn];
LL quickpow(LL a,LL b)
{
    LL ans=1;
    while(b)
    {
        if(b&1)ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans%mod;
}
LL inv(LL a)
{
    return quickpow(a,mod-2);
}
LL C(int a,int b)
{
    if(a==b || b==0)return 1;
    else return ((f[a]*inv(f[b]))%mod*inv(f[a-b]))%mod;
}
int main()
{
    int T;
    f[0]=0;f[1]=1;
    for(int i=2;i

 

你可能感兴趣的:(zcmu)