zhao_ry514114
赵若伊

导航

 

思路

观察操作 \(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;
}
posted on 2026-09-11 19:11  zhao_ry514114  阅读(13)  评论(0)    收藏  举报