思路
观察操作 \(ARC\rightarrow CRA\)。
如果我们构造的字符串始终形如:
?R?R?R...
其中 ? 只可能是 A 或 C,那么可以暂时忽略所有的 R。
此时一次:
ARC -> CRA
实际上就相当于:
AC -> CA
也就是把相邻的一个 A 和一个 C 交换。
因此,设去掉所有 R 后得到字符串 \(T\),那么 \(f(S)\) 就等于 \(T\) 中满足 \(i<j,\quad T_i=A,\quad T_j=C\) 的二元组数量。
也就是说,每个 A 的贡献等于它右边 C 的数量。
构造
先放置 \(25\) 个 C:
CR CR CR ... CR
考虑在第一个 C 前加入一个 AR。
因为它的右边一共有 \(25\) 个 C,所以这个 A 会贡献 \(25\) 次操作。
同理:
- 在第二个
C前加入一个AR,贡献 \(24\); - 在第三个
C前加入一个AR,贡献 \(23\); - ...
- 在最后一个
C前加入一个AR,贡献 \(1\)。
所以我们可以从 \(25\) 到 \(1\) 贪心。
当前贡献为 cnt 时,只要 \(X\ge cnt\)。
就在当前 CR 前输出一个 AR,并令 \(X\leftarrow X-cnt\)。
直到不足 cnt,再进入下一组。
这样最终所有 A 的贡献之和一定恰好为原来的 \(X\)。
由于 \(X\le600\),最坏情况下可以直接使用 \(24\) 个贡献为 \(25\) 的 A:\(24\times25=600\)。
所以最多输出 \(24\) 个 AR 和 \(25\) 个 CR,字符串长度最多为 \(2(24+25)=98\le100\),满足题目限制。
特别地,当 \(X=0\) 时不会输出任何 AR,只会输出 \(25\) 个 CR,显然没有 ARC,因此答案也是合法的。
代码
#include <bits/stdc++.h>
#define rep(i,j,k) for (int i = (j); i <= (k); i ++)
#define per(i,j,k) for (int i = (j); i >= (k); i --)
#define uint unsigned int
#define ll long long
#define ull unsigned long long
#define db double
#define ldb long double
#define mkp make_pair
#define eb emplace_back
#define e_ emplace
#define ls (p << 1)
#define rs (p << 1 | 1)
//#define int ll
using namespace std;
//const int N = ;
//const int MOD = 998244353;
//const int MOD = 1000000007;
const int INF = 0x3f3f3f3f;
const ll LINF = 4e18;
//int T;
int n;
signed main () {
//freopen (".in", "r", stdin);
//freopen (".out", "w", stdout);
ios::sync_with_stdio (0);
cin.tie (0);
//init ();
//cin >> T;
//while (T --) {}
cin >> n;
int cnt = 25;
rep (i, 1, 25) {
while (n >= cnt) {
n -= cnt;
cout << "AR";
}
cout << "CR";
cnt --;
}
return 0;
}
浙公网安备 33010602011771号