Moo

click

一道与格雷码类似的题目 先把前几个串的长度求出来,二分查找出属于哪一个串

然后递归求解就可以

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
31
32
33
#include <bits/stdc++.h>
#define int long long
#define debug
using namespace std;
//东方之珠 整夜未眠!
const int N = 1e5+66;

int s[N];

inline int dfs(int x, int k)
{
if (k == 0) return x == 1 ? 1 : 0;//递归边界
if (x <= s[k - 1]) return dfs(x, k - 1);//属于左边的上一个串
if (x > s[k] - s[k - 1]) return dfs(x + s[k - 1] - s[k], k - 1);//属于右边的上一个串
// if (x < s[k - 1] || x > s[k - 1] + 3 + k) dfs(x, k - 1);
else if (x == s[k - 1] + 1) return 1;//中间的...特判就好
return 0;
}

inline int thestars()
{
int i, j, n;
s[0] = j = 3;
for (i = 1; i <= 30; ++ i) s[i] = (s[i - 1] << 1) + (++ j);
cin >> n;
j = lower_bound(s + 1, s + 28, n) - s;
dfs(n, j) == 1 ? puts("m") : puts("o");
return 0;
}

int youngore = thestars();

signed main() {;}

后记

一年前坐在秦皇岛的考场上做格雷码,连打暴力加想正解,加各种调试,花了三个小时

如今正解+调试花了不到半个小时

一路走过来

才发现,我真的提高了

祝NOIP-2020全省Rank前3