Description
A,B 两人玩一个游戏,共有 t 轮,每轮没人随机等概率从 [-k,k] 中选一个数字加到总得分中,初态下分别有 a,b 分,末态下得分高者胜利。问 A 胜利的概率 ( imes (2k+1)^2t) 的在模 (10^9+7) 下的值。(t le 100, kle 1000)
Solution
设第 (i) 次(每轮算两次)时分差为 (j) 的概率 ( imes (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;
}