2157:K.lyの旅行計画
時間制限: 1秒 メモリ制限: 128 MB送信: 11 解決: 3
[ 送信 ] [ ステータス ] [ Webボード ]
説明
夏休みが間もなく始まり、lyは休暇旅行計画を準備し始めました。彼女は非常に素晴らしい列車のチケットを購入しました。この列車のルートをX軸と見なすと、lyは0の位置で列車に乗ることになります。それから彼女の旅が始まった。この魔法の列車には魔法の旅行規則があり、座標Xにある場合、毎日(X + 1)に移動する確率は1/4、(X-1)に移動する確率は1/4です。あと1日間、その場所にとどまる確率は1/2です。
lyの良き友人として、wjwはもちろんlyとの付き合いを望んでいますが、wjwは最初に家に帰る必要があるため、wjwは座標Mでlyを待つことになります。 N日目にポイントMに到達すると、wjw
が表示されます。明らかに、答えはA / B(A、Bは比較的素数)で表すことができ、Qは1000000007で割り切れません。A(B ^ -1)mod 1000000007の結果を出力してください。 (B ^ -1)は、B乗算1000000007の逆モジュロです。
入力
タイトルが示唆するように、複数のデータセット、最初の行には正の整数T(T <= 10)が含まれ、各行には2つの正の整数N、M(0 <= n、| M | <= 100000)があります。
出力
NとMの各グループの出力結果
入力例
出力例
【分析】
0からmまでのiステップを取る場合は、imステップに戻り、最後の位置にとどまる必要がありますn + m-2 * iステップ
したがって、答えはc [n] [i] * c [ni] [im] * A * B * Cです。
A、B、およびCはそれぞれ、iステップ、imステップ、n + m-2 * iステップを取る確率を表しますC [n] [i] = n!/ i!/(ni)!
次に、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;
}