目录
Contest Info
Solved | A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
8/13 | O | - | O | - | O | O | - | O | - | O | - | O | O |
- O 在比赛中通过
- Ø 赛后通过
- ! 尝试了但是失败了
- - 没有尝试
Solutions
A. Cat
题意:
每次询问给出(L, R, S),要求找一个最长的连续区间(l, r),满足(l oplus (l + 1) oplus, cdots, oplus r <= S)。
思路:
考虑(4k oplus (4k + 1) oplus (4k + 2) oplus (4k +3) = 0)
那么我们枚举一下头,枚举一下尾,暴力判断一下即可。
代码:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = 0x3f3f3f3f3f3f3f3f;
ll L, R, S;
ll gao(ll l, ll r) {
if (l > r) return INF;
ll res = 0;
if (r - l + 1 <= 10) {
for (ll i = l; i <= r; ++i) {
res ^= i;
}
} else {
ll ql = l, qr = r;
while (ql % 4 != 0) {
res ^= ql;
ql++;
}
while (qr % 4 != 3) {
res ^= qr;
qr--;
}
}
return res;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
scanf("%lld %lld %lld", &L, &R, &S);
ll res = -1;
for (int i = 0; i <= 4; ++i) {
for (int j = 0; j <= 4; ++j) {
ll tmp = gao(L + i, R - j);
if (tmp <= S) res = max(res, (R - j) - (L + i) + 1);
}
}
printf("%lld
", res);
}
return 0;
}
B. Cats line up
题意:
给出(n)个数,问有多少个排列使得任意相邻两个数的差距小于等于(K(1 leq K leq 3))
C. < 3 numbers
题意:
令(x)为区间([L, R])内素数个数,每次询问给出([L, R]),判断下式是否成立:
[egin{eqnarray*}
frac{x}{R - L + 1} < frac{1}{3}
end{eqnarray*}
]
思路:
考虑素数密度,大区间直接'Yes'
小区间暴力判断
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int L, R, pri[N], check[N];
void sieve() {
memset(check, 0, sizeof check);
for (int i = 2; i < N; ++i) {
if (!check[i]) {
pri[++*pri] = i;
}
for (int j = 1; j <= *pri; ++j) {
if (1ll * i * pri[j] >= N) break;
check[i * pri[j]] = 1;
if (i % pri[j] == 0) break;
}
}
}
bool prime(int x) {
if (x < N) return !check[x];
for (int i = 2; 1ll * i * i <= x; ++i) {
if (x % i == 0)
return false;
}
return true;
}
bool ok(int l, int r) {
int tot = r - l + 1;
int p = 0;
for (int i = l; i <= r; ++i) {
if (prime(i)) {
++p;
}
}
return p * 3 < tot;
}
int main() {
sieve();
int _T; scanf("%d", &_T);
while (_T--) {
scanf("%d%d", &L, &R);
if (R - L + 1 > 60) {
puts("Yes");
} else {
puts(ok(L, R) ? "Yes" : "No");
}
}
return 0;
}
E. Multiply
题意:
给出(n)个数(a_i),令(Z = a_1! imes a_2! imes cdots imes a_n!)
现在给出(X, Y),令(b_i = Z imes X^i),它想要一个最大的(i),使得(b_i ;|; Y!)
思路:
考虑分解(X)得到它的所有素因子及幂次。
然后找出其每个因子在(frac{Y!}{Z})中还剩多少个。
然后贪心拼(X)就可以了
代码:
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define dbg(x...) do { cout << "