写点无脑做法。
设走私者的策略是 \(p_i\) 概率选 \(i\),检查官的策略是 \(q_i\) 概率选 \(i\)。
因为两者策略均最优,所以走私者选任意一个数得到的期望收益相同,检查官选任意一个数得到的期望收益也相同,下面只讨论检察官方面的概率确定。
若走私者选 \(i\),那么走私者的期望收益为:
\[w_i=i\sum_{j<i} q_j+\sum_{j>i} q_j\frac j 2 \]因为收益相同,所以 \(w_{i+1}-w_i=0\),可以得到:
\[\sum_{j<i}q_j+(i+1)q_i-q_{i+1}\frac {i+1}{2}=0 \]记 \(q_i\) 的前缀和为 \(s_i\),有:
\[s_{i-1}+(i+1)(s_i-s_{i-1})-\frac {i+1}{2}(s_{i+1}-s_i)=0 \]注意到 \(s_n=1\),这些方程写成矩阵是一个形如下图的带状矩阵:
1100
1110
0111
0011
使用带状矩阵高斯消元即可在 \(O(d^2n)\) 的时间复杂度内得到答案,本题中 \(d=2\),求 \(p\) 的方法类似。
int ans[N],a[N],b[N];
signed main() {
int n=read();
FOR(i,1,n) {
if(i-1>0) g[i][i-1]=mod-i+1;
g[i][i]=3ll*i%mod*inv2%mod;
if(i+1<=n) g[i][i+1]=(mod-1ll*i*inv2%mod)%mod;
else g[i][n+1]=1ll*i*inv2%mod;
}
Guass(n,2,ans);
ans[n+1]=1;
FOR(i,1,n+1) b[i]=(ans[i]-ans[i-1]+mod)%mod;
FOR(i,1,n) {
if(i-1>0) g[i][i-1]=(mod-1ll*(i-1)*inv2%mod)%mod;
g[i][i]=3ll*i%mod*inv2%mod;
if(i+1<=n) g[i][i+1]=(mod-i)%mod;
else g[i][n+1]=i;
}
FOR(i,1,n+1) ans[i]=0;
Guass(n,2,ans);
ans[n+1]=1;
FOR(i,1,n+1) a[i]=(ans[i]-ans[i-1]+mod)%mod;
FOR(i,1,n+1) printf("%d ",a[i]); puts("");
FOR(i,1,n+1) printf("%d ",b[i]); puts("");
}
标签:THUPC,题解,矩阵,初赛,走私者,inv2%,mod
From: https://www.cnblogs.com/cnyzz/p/17191090.html