「THUPC 2023 初赛」欺诈游戏 题解

写点无脑做法。

设走私者的策略是 \(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("");
}
posted @ 2023-03-10 15:42  时一月  阅读(56)  评论(0)    收藏  举报