xtq的棋盘-赛后题解
20pts:
感性理解数学期望的定义,我们可以采用多次模拟随机过程的的暴力方法来算出数据很小时的期望值。
事实上,对于题目中给出的数据范围只需要模拟10000次随机过程并且计算平均的时间再四舍五入即可准确得到答案而不超出时限。
40pts:
接下来我们设向左走的概率为
考虑一个期望的线性方程组。
设
使用高斯消元在模意义下解这个方程组,答案为
70pts:
发现
两侧同时加上
设
我们发现
对于一个首项为
之前暂时没有考虑
那么,
此题完结。
代码:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define mod 1000000007
using namespace std;
typedef long long ll;
inline ll qpow(ll a, ll b)
{
ll res = 1;
while(b)
{
if(b&1) res = res*a%mod;
a = a*a%mod;
b >>= 1;
}
return res;
}
inline ll inv(ll x)
{
return qpow(x,mod-2);
}
ll prb,qrb,rrb;
inline ll calc(ll x)
{
return ((1-qpow(qrb,x))%mod+mod)%mod*inv(((1-qrb)%mod+mod)%mod)%mod;
}
int main()
{
ll n,m,p,q;
cin >> n >> m >> p >> q;
prb = p*inv(q)%mod;
qrb = ((1-prb)%mod+mod)%mod*inv(prb)%mod;
rrb = (mod-1)*inv(((1-2*prb%mod)%mod+mod)%mod)%mod;
if(q==2&&p==1)
cout << ((2*n%mod-m)%mod+mod)%mod*m%mod << endl;
else
{
ll ans = ((1-rrb)%mod+mod)%mod;
ans = ans*(((calc(n)-calc(n-m))%mod+mod)%mod)%mod;
ans = (ans+(m*rrb)%mod)%mod;
cout << ans << endl;
}
return 0;
}