Description

A,B 两人玩一个游戏,共有 t 轮,每轮没人随机等概率从 [-k,k] 中选一个数字加到总得分中,初态下分别有 a,b 分,末态下得分高者胜利。问 A 胜利的概率 \(\times (2k+1)^2t\) 的在模 \(10^9+7\) 下的值。\(t \le 100, k\le 1000\)

Solution

设第 \(i\) 次(每轮算两次)时分差为 \(j\) 的概率 \(\times (2k+1)^i\)\(f[i][j]\),则

\[f[i][j]=\sum_{l=j-k}^{j+k} f[i-1][l] \]

用一下前缀和即可。

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 400005;
const int mod = 1e9+7;

int f[N],g[N],a,b,k,t;

signed main()
{
    ios::sync_with_stdio(false);

    cin>>a>>b>>k>>t;
    t*=2;

    f[k*t]=1;
    for(int i=1;i<N;i++) f[i]+=f[i-1], f[i]%=mod;

    for(int i=1;i<=t;i++)
    {
        for(int j=0;j<N;j++)
        {
            if(j-k-1<0) g[j]=f[j+k];
            else g[j]=(f[min(N-1,j+k)]-f[j-k-1]+mod)%mod;
        }
        f[0]=g[0];
        for(int j=1;j<N;j++) f[j]=g[j], f[j]+=f[j-1], f[j]%=mod;
    }

    int ans=0;
    for(int i=0;i<k*t+a-b;i++) ans+=g[i], ans%=mod;

    cout<<ans<<endl;
}

相关文章: