T1:字符串加密

本题难度简单,根据题目描述模拟即可。

代码实现
#include <bits/stdc++.h>

using namespace std;

int main() {
    string s;
    cin >> s;
    
    for (char& c : s) {
        if (islower(c)) c -= 32;
        else c += 32;
    }
    
    reverse(s.begin(), s.end());
    
    cout << s << '\n';
    
    return 0;
}

T2:美丽的数

本题难度简单,只有完全平方数才可能满足只有 \(3\) 个约数,再满足算术平方根是质数时,就一定只有 \(3\) 个约数,那么可以先筛出所有质数,然后每次判断给定的数是否为完全平方数且算术平方根是质数。

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;

// linear sieve
vector<int> ps, pf;
void sieve(int mx) {
    pf.resize(mx + 1);
    rep(i, mx + 1) pf[i] = i;
    for (int i = 2; i <= mx; ++i) {
        if (pf[i] == i) ps.push_back(i);
        rep(j, ps.size()) {
            int x = ps[j] * i;
            if (x > mx) break;
            pf[x] = ps[j];
        }
    }
}

int main() {
    sieve(1e6);
    
    int q;
    cin >> q;
    
    while (q--) {
        ll x;
        cin >> x;
        ll y = sqrtl(x);
        if (y > 1 and y*y == x and pf[y] == y) puts("Yes");
        else puts("No");
    }
    
    return 0;
}

T3:全都为1

本题难度较大,考察二维递推,每个位置上的棋子是否需要单独翻转一次是受它本来的颜色和其已经翻转的次数决定。

c[i][j] 表示位置 \((i, j)\) 上的棋子颜色变了多少次。

位置 \((i, j)\) 上的棋子受其左上部分的棋子进行操作而产生的变化次数 c[i][j] = c[i-1][j] + c[i][j-1] - c[i-1][j-1](容斥原理)。

  • 如果位置 \((i, j)\) 上初始时的棋子是黑色,且 \(c[i][j]\) 是偶数,那么位置 \((i, j)\) 上的棋子不需要进行操作;
  • 如果位置 \((i, j)\) 上初始时的棋子是白色,且 \(c[i][j]\) 是奇数,那么位置 \((i, j)\) 上的棋子不需要进行操作;
  • 如果位置 \((i, j)\) 上初始时的棋子是白色,且 \(c[i][j]\) 是偶数,那么位置 \((i, j)\) 上的棋子需要进行一次操作;
  • 如果位置 \((i, j)\) 上初始时的棋子是黑色,且 \(c[i][j]\) 是奇数,那么位置 \((i, j)\) 上的棋子需要进行一次操作

如果位置 \((i, j)\) 上的棋子需要进行一次操作,则 c[i][j]++,且需要进行的操作次数加一。

代码实现
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

int main() {
    int n;
    cin >> n;
    
    vector<vector<int>> a(n, vector<int>(n));
    rep(i, n)rep(j, n) cin >> a[i][j];
    
    vector<vector<int>> c(n, vector<int>(n));
    rep(i, n)rep(j, n) {
        int now = 0;
        if (i-1 >= 0) now += c[i-1][j];
        if (j-1 >= 0) now += c[i][j-1];
        if (i-1 >= 0 and j-1 >= 0) now -= c[i-1][j-1];
        c[i][j] = now;
        
        if (a[i][j] == 0 and c[i][j]%2 == 0) c[i][j]++;
        if (a[i][j] == 1 and c[i][j]%2 == 1) c[i][j]++;
    }
    
    cout << c[n-1][n-1] << '\n';
    
    return 0;
}