T1. 反轉(zhuǎn)

枚舉反轉(zhuǎn)了多少行和列(因?yàn)樾泻托兄g本身沒有區(qū)別,列同理),算一下是否有 \(k\) 個(gè)格子被反轉(zhuǎn)。

代碼實(shí)現(xiàn)
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

void solve() {
    int n, m, k;
    cin >> n >> m >> k;
    
    rep(i, n+1) {
        rep(j, m+1) {
            if (i*j + (n-i)*(m-j) == k) {
                puts("Yes");
                return;
            }
        }
    }
    
    puts("No");
}

int main() {
    int t;
    cin >> t;
    
    while (t--) solve();
    
    return 0;
}

T2. 函數(shù)

請(qǐng)注意,該序列是循環(huán)的,意味著序列的形式如下:

\[[a, b, a \oplus b, a, b, a \oplus b, \cdots] \]

我們幾乎可以通過確定循環(huán)節(jié)來完成整個(gè)任務(wù)。循環(huán)節(jié)個(gè)數(shù)是 \(3\) 個(gè)整數(shù)組成的段數(shù)。區(qū)間長(zhǎng)度是 \(r-l+1\),因此循環(huán)節(jié)個(gè)數(shù)為 \(\lfloor\frac{r-l+1}{3}\rfloor\)

我們通過注意到循環(huán)從區(qū)間第一個(gè) \(a\) 開始,最后一個(gè) \(a \oplus b\) 結(jié)束,來獲取循環(huán)開始和結(jié)束下標(biāo)。除此之外,我們?cè)賮砬笫S嗟脑兀ㄗ疃?\(2\) 個(gè))的和,循環(huán)部分的和為:

\[\lfloor\frac{r-l+1}{3}\rfloor \times (a + b + a \oplus b) \]

總復(fù)雜度為 \(O(n)\)

代碼實(shí)現(xiàn)
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;
using ll = long long;

void solve() {
    int a, b, l, r;
    cin >> a >> b >> l >> r;
    --l; --r;
    
    vector<int> x(3);
    x[0] = a;
    x[1] = b;
    x[2] = a^b;
    
    ll sum = 0;
    rep(i, 3) sum += x[i];
    
    int n = r-l+1;
    int si = l%3;
    ll ans = n/3*sum;
    n %= 3;
    rep(i, n) ans += x[(si+i)%3];
    
    cout << ans << '\n';
}

int main() {
    int t;
    cin >> t;
    
    while (t--) solve();
    
    return 0;
}