Game
题意:给定一个集合,
n
n
n 个数字,两人每次选择一个数
x
x
x,然后
x
−
9
,
x
−
99
,
x
−
999...
x-9,x-99,x-999...
x−9,x−99,x−999...,但是要求操作后的数字必须大于
0
0
0,并且不和集合中的数字发生重复
A
l
i
c
e
Alice
Alice 和
B
o
b
Bob
Bob 轮流操作,
A
l
i
c
e
Alice
Alice 先开始,不能对这些数进行操作的人就是输者。
思路:
题解
核心思路:我们只关心总操作次数的奇偶性,它会直接影响博弈结果,观察到这些数都是
9
9
9 的倍数,
1
0
k
−
1
10^k-1
10k−1 是奇数个
9
9
9 ,即所有操作不会改变总操作次数的奇偶性,因此所有操作都是等价的,我们可以将这个问题转化为每次减
9
9
9
剩下的问题就是每次
−
9
-9
−9,我们可以进行多少次
考虑到每个数可以表示为
9
∗
k
+
r
e
s
9*k+res
9∗k+res,如果
r
e
s
res
res 没有出现,
k
k
k 即为该数对操作次数的贡献
因为每个数
r
e
s
res
res 会影响它对总操作次数
进而我们可以想到按照
r
e
s
res
res 即
%
9
\%9
%9 进行分组,把每个数依次构造成
0
×
9
+
r
e
s
0\times9+res
0×9+res,
1
×
9
+
r
e
s
.
.
.
1\times9+res...
1×9+res...
例如:
12
%
9
=
3
12\%9=3
12%9=3,把
12
12
12 减成
3
3
3,再来一个
21
21
21,它就不能减成
3
3
3,而应该减成
12
12
12。因此这个我们可以通过记录
%
3
\%3
%3 的数的个数来进行判断。
注意:
%
9
=
0
\%9=0
%9=0,最低应该减成
9
9
9,而不是
0
0
0。
总操作数如果为偶数,则
B
B
B 赢,反之,则
A
A
A 赢。
code:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 1e6 + 9;
const ll mod = 1e9 + 7;
const ll inf = 0x3f3f3f3f;
ll n, m, k;
ll cnt[15], a[maxn];
void work()
{
memset(cnt, 0, sizeof(cnt));
ll sum = 0;
cnt[0] = 1;// %9=0最低减成9,因此初始%9=0的位置先把0占上
for(int i = 1; i <= n; ++i)
{
cin >> a[i];
sum += a[i] / 9 - cnt[a[i] % 9];
++cnt[a[i] % 9];
}
cout << "BA"[sum & 1] << "\n";
}
int main()
{
ios::sync_with_stdio(0);
while(cin >> n)
work();
return 0;
}