一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
二、解题报告
1、思路分析
我们考虑一个位置符合什么条件可以必胜?
如果可以跳到一个必败的位置
考虑最大的格子一定是必败
而每个格子只能跳到比自己大的格子
于是我们就可以倒序处理状态
对于每个格子枚举比自己大的整数倍距离的格子中是否有必败态
似乎是O(N^2),但是由于枚举的是自己的倍数距离的下标, 是O(NlnN)的
2、复杂度
时间复杂度: O(NlnN)空间复杂度:O(N)
3、代码详解
cpp
#include <bits/stdc++.h>
using i64 = long long;
using i128 = __int128;
using PII = std::pair<int, int>;
const int inf = 1e8 + 7, P = 1e9 + 7;
void solve() {
int n;
std::cin >> n;
std::vector<int> a(n), pos(n);
std::vector<bool> f(n);
std::string res(n, 'B');
for (int i = 0; i < n; i ++ ) std::cin >> a[i], pos[a[i] - 1] = i;
for (int i = n; i; i -- ) {
int j = pos[i - 1];
while (j >= i) j -= i;
for (; j < n; j += i) {
if (a[j] <= i) continue;
if (!f[j]) {
f[pos[i - 1]] = true;
break;
}
}
if (f[pos[i - 1]]) res[pos[i - 1]] = 'A';
}
std::cout << res;
}
int main(int argc, char** argv) {
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
int _ = 1;
// std::cin >> _;
while (_ --)
solve();
return 0;
}