题解:P12775 [POI 2018/2019 R1] 子序列 Subsequences
ForgetOIDuck · · 题解
神秘脑电波还在追我???
题意
给定
思路
首先需要意识到,几个特殊性质是用来帮助你骗分不是用来帮助你过题的。
然后需要意识到,这个限制及其宽松。所以我们考虑加强:将字符集缩到
这样我们的思路就集中多了。尝试对一个字符串进行计数。
设
初始
又假如现在我们已经有了
我们先不用管
这玩意不是辗转相减吗?所以这个等价于
这玩意等价于
但是我们刚刚没有考虑
考虑什么情况下会爆炸,也就是当
时间复杂度
代码
友情提示:不要用 rand()。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, T, len;
char ans[1002];
ll gcd(ll x, ll y) {
return y ? gcd(y, x % y) : x;
}
mt19937_64 rnd(random_device{}());
inline ll rd(ll l, ll r) {
return rnd() % (r - l + 1) + l;
}
int main() {
cin >> T;
while (T -- ) {
cin >> n; n ++;
while (1) {
len = 0;
ll dp0 = rd(1, n - 1), dp1 = n - dp0;
while (gcd(dp0, dp1) != 1) dp0 = rd(1, n - 1), dp1 = n - dp0;
while (len <= 1000 && (dp0 > 1 || dp1 > 1)) {
if (dp0 > dp1) dp0 -= dp1, ans[++ len] = 's';
else dp1 -= dp0, ans[++ len] = 'b';
}
if (dp0 > 1 || dp1 > 1) continue;
for (ll i = 1; i <= len; i ++ ) putchar(ans[i]);
putchar('\n');
break;
}
}
}