AT_arc148_d [ARC148D] mod M Game

· · 题解

参考了 AT 官方题解里的这一篇。

Solution

S_A, S_B 分别表示两个人拿的数的总和,sum 为所有数的总和。

Bob 的获胜条件为:S_A \equiv S_B \pmod m

又由于 S_A+S_B=sum,推出 2 \times S_A \equiv sum \pmod m

将所有 a_i2,问题转化成,令 Alice 拿走 n 个数之和为 newS_A,如果 Bob 能够“操控” Alice 的操作,使得 newS_A \equiv sum \pmod m,Bob 就能赢。

考虑 Bob 如何”操控“。如果满足 newS_A \equiv sum \pmod m,说明 Bob 拿走另外 n 个数之和 newS_B 也会满足 newS_B \equiv sum \pmod m。也就是说,Bob 只要模仿 Alice 做镜像操作就能够尽可能地满足 newS_A \equiv sum \pmod m

所以 Bob 要赢需要同时满足两个条件:

  1. 每一步 Bob 都能够完成镜像操作。

所以实现上只需要统计 a_i \times 2 \bmod m 的出现次数的奇偶性,以及求出 sumnewS_A 进行判断。于是这个题就做完了。

可能会有人疑问:为什么要将所有 a_i2

如果不乘 2,Bob 在某一步无法进行镜像操作的时候,并不一定会直接输掉。Bob 可能可以进行”错位匹配“。这样的话就会使得情况变得复杂,需要进行一些分讨。例子就是:

2 4
0 1 2 3
另外根据其他题解 $2a \equiv 2b \pmod m$,推导出的匹配方式:$(x,x)$ 互相匹配,或者 $(x,x+\dfrac{m}{2})$ 匹配。把所有 $a_i$ 乘 $2$ 后,能把 $(x,x+\dfrac{m}{2})$ 这种匹配方式消除掉。相当于把所有 $a_i$ 乘 $2$ 后,剩下的匹配方式只有 $(x,x)$ 互相匹配,于是就变成了这个题解的做法。 ### Code [AC记录](https://atcoder.jp/contests/arc148/submissions/76597474) :::success[代码] ```cpp #include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF=0x3f3f3f3f; const ll LLINF=0x3f3f3f3f3f3f3f3fLL; const int MAX=2e5+10; int main() { int n,m,i,x,ok,sum,now; scanf("%d%d",&n,&m); map<int,int> mp; sum=0; for(i=1;i<=2*n;i++) { scanf("%d",&x); sum=(sum+x)%m; mp[x*2%m]++; } ok=0; now=0; for(auto &it:mp) { if(it.second%2) ok=1; else now=(now+1LL*it.first*it.second/2)%m; } if(ok || now!=sum) puts("Alice"); else puts("Bob"); return 0; } ``` :::