2157: K.ly的旅行计划
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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;
}