T1. 反转

枚举反转了多少行和列(因为行和行之间本身没有区别,列同理),算一下是否有 \(k\) 个格子被反转。

代码实现
#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. 函数

请注意,该序列是循环的,意味着序列的形式如下:

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

我们几乎可以通过确定循环节来完成整个任务。循环节个数是 \(3\) 个整数组成的段数。区间长度是 \(r-l+1\),因此循环节个数为 \(\lfloor\frac{r-l+1}{3}\rfloor\)

我们通过注意到循环从区间第一个 \(a\) 开始,最后一个 \(a \oplus b\) 结束,来获取循环开始和结束下标。除此之外,我们再来求剩余的元素(最多 \(2\) 个)的和,循环部分的和为:

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

总复杂度为 \(O(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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/955872.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!