A. サクラコの試験
解法
全探索で解く。
コード
#include <iostream>
using namespace std;
void solve() {
int a, b;
cin >> a >> b;
for (int i = 0; i <= a; i++) {
for (int j = 0; j <= b; j++) {
if (i + j * 2 == (a - i) + (b - j) * 2) {
cout << "YES\n";
return;
}
}
}
cout << "NO\n";
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
B. 正方形判定
解法
n が完全平方数かを確認し、文字列の最初と最後の m 文字が 1 で埋まっているか、真ん中の部分が 100...001 の形式になっているかをチェックする。
コード
#include <iostream>
#include <cmath>
using namespace std;
void solve() {
int n;
cin >> n;
string s;
cin >> s;
int m = sqrt(n);
if (m * m != n) {
cout << "No\n";
return;
}
string top = string(m, '1');
string mid = "1" + string(m - 2, '0') + "1";
if (s.substr(0, m) != top || s.substr(n - m) != top) {
cout << "No\n";
return;
}
for (int i = m; i < n - m; i += m) {
if (s.substr(i, m) != mid) {
cout << "No\n";
return;
}
}
cout << "Yes\n";
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}
C. 最長の良い配列
解法
公差が 1 の等差数列を使って最適な配列を構築する。差分の総和を用いて最大の項数を求めればよい。
コード
#include <iostream>
using namespace std;
void solve() {
long long a, b;
cin >> a >> b;
long long l = 1, r = 2e9, ans = 0;
while (l <= r) {
long long mid = (l + r) / 2;
if (mid * (mid + 1) <= (b - a) * 2) {
l = mid + 1;
ans = mid;
} else {
r = mid - 1;
}
}
cout << ans + 1 << "\n";
}
int main() {
int t;
cin >> t;
while (t--) {
solve();
}
return 0;
}