CF 1537D Deleting Divisors

题目描述

http://codeforces.com/problemset/problem/1537/D

简要题解:开始有一个正整数 $n$,每次操作可以减掉 $n$ 的一个不是 $1$ 和 $n$ 的因子,不能操作的人输,求是否先手必胜

$n\le 10^9$

Solution

我们分三种情况讨论:

  1. $n$ 是奇数
  2. $n$ 是偶数但不是 $2$ 的幂
  3. $n$ 是 $2$ 的幂

第一种情况,$n$ 是奇数,所以 $n$ 的因子 $d$ 也一定是奇数,因为我们一定有 $d|(n-d)$,所以 $n-d$ 一定不是 $2$ 的幂,所以第一种情况只能转化到第二种情况

第二种情况,由于 $n$ 是偶数且不是 $2$​ 的幂,所以一定存在一个奇因子,所以一定能转化到第一种情况,由于第一种情况最终是必败态,所以第二种情况一定是必胜态

第三种情况,当 $n$ 是 $2$ 的幂时,我们要么减掉 $\frac n 2$ 维持第三种情况,要么转换到第二种情况,但是第二种情况是必胜态,所以我们只能维持第三种情况,容易得到当 $n$ 是 $2$ 的偶数幂时必胜,奇数幂必败

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <queue>
#define maxn 200010
#define ll long long
#define INF 1000000000
using namespace std;

int n;

void work() {
cin >> n;
if (n & 1) return cout << "Bob" << "\n", void();
if (n % 2 == 0) {
ll t = 2;
while (t < n) t *= 4;
if (t == n) return cout << "Bob" << "\n", void();
} cout << "Alice" << "\n";
}

int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);

int T; cin >> T;
while (T--) work();
return 0;
}