ZCMU — 2157

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の各グループの出力結果

入力例

2
2-2
0 0

出力例

562500004
1

【分析】

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;
}

おすすめ

転載: blog.csdn.net/jnxxhzz/article/details/80691698
おすすめ