Codeforces Round 836题解(A、B、C)

A. SSeeeeiinngg DDoouubbllee

直接将原字符串翻转一下拼到原字符串的后面就构成了回文串。

string s;

void solve() {
    cin >> s;
    cout << s;
    reverse(s.begin(), s.end());
    cout << s << '\n';
}

B. XOR = Average

n的奇偶性考虑,若n为奇数,我们可以让所有的ai相等,这样a1a2an=a1=na1n。若n为偶数,我们可以考虑可否将n为奇数时的某个ai拆成两个ai1ai2,使得ai1ai2=ai并且ai1+ai22=ai,这样就仍然满足a1a2an=a1=na1n。容易发现13就刚好满足这样的限制,13=2并且1+32=2

int n;

void solve() {
    cin >> n;
    if (n & 1) {
        for (int i = 1; i <= n; i ++) {
            cout << 1 << ' ';
        }
        cout << '\n';
    }
    else {
        cout << 1 << ' ' << 3 << ' ';
        for (int i = 1; i <= n - 2; i ++) {
            cout << 2 << ' ';
        }
        cout << '\n';
    }
}

C. Almost All Multiples

如果1这个位置放的是n,那么一定是可以构造出来一个排列的,并且字典序最小的排列就是除了1n这两个位置外的其他位置i都放i

排放形式如下:
n 2 3 4 5 6 7 8 9 10 11 1(n12的情况)

如果1这个位置放的不是n,譬如说是x,那么我们就必须把x这个位置后面的是x的倍数的数放到x这个位置,并在那个数的位置上放上新的数。

那么如果n不是x的倍数,则n也不会是x2,x3,这些数的倍数,则我们按照上述的规则移动了一些数的位置后,最后n就无法用来补上最后移动的那个数所空缺下来的位置,所以这种情况下应该输出1

贪心地考虑,当nx的倍数时,我们可以选择形如x,x2,x23,x25,n这些位置,将这些位置上的数向左移动一位,最后把n补到最后一位。显然,将nx分解质因数,可以使乘的倍数的次数最大化,即让字典序较小的数字更多地靠前,且按照质因数从小到大的顺序乘,即让字典序越小的数越靠前。这样得到的排列就是最优的。

对于n=12举例,x=4的话,所求排列就是这样的:

4 2 3 12 5 6 7 8 9 10 11 1

int n, x;

void solve() {
    cin >> n >> x;
    if (n % x != 0) {
        cout << -1 << '\n';
        return;
    }
    int y = n / x;
    vector<int> bag;
    for (int i = 2; i <= y / i; i ++) {
        if (y % i == 0) {
            while (y % i == 0) {
                bag.push_back(i);
                y /= i;
            }
        }
    }
    if (y > 1) bag.push_back(y);
    vector<int> ans(n + 1, 0);
    for (int i = 1; i <= n; i ++) {
        ans[i] = i;
    }
    ans[1] = x, ans[n] = 1;
    int cur = x;
    for (int i = 0; i < (int)bag.size(); i ++) {
        int t = cur;
        cur *= bag[i];
        ans[t] = cur;
    }
    for (int i = 1; i <= n; i ++) {
        cout << ans[i] << ' ';
    }
    cout << '\n';
}
posted @   lightmon  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示