写个自己看的(
很久没打过 Luogu 的 rated 赛了,一是因为时间冲突,二是因为 Luogu 的 rated 赛真的少(雾)
很没有出息,只有 200 pts. 因为 T1 T2 调了太久细节,所以 T3 T4 根本就没看(大佬们都 ak 力)。
T1 挺恶心的,题目想了 10 分钟,才看到数据范围中的 $\frac{k+1}{2} \le n$,也就是只需要考虑最后两行。
是小学的 等差数列 公式还有 贪心,不过这倒不是什么难的地方,最恶心的还是这题目卡取模。
试过几个方法,乱取模(30pts)、只在输出的时候膜一下(90 pts)、写挂逆元 (60 pts /jy)、逆元 (100 pts)、龟速乘(100 pts)。比赛的时候第一次 100 是逆元(看来龟速乘还是不熟练 /kk)
T2 是一个可爱的构造题,思路如下:
- 若
n = 1
n = m
n = 2 && st[0] != st[1]
满足其中一个,则输出 -1。此时已经保证下面操作 $n < m$。 - 扫描字符串,找到一个 $j$ 满足 $st_j = st_{j+1}$,若找不到则 $j = size_{st} - 2$。
- 接着对字符串跑一轮输出,若到了 $j$ 点,则再额外输出 $(st_j \oplus 48 \oplus 1) + 48$(其实就是 1 变 0;0 变 1)。
- 输出 $m - n + 1$ 个 $(st_{size_{st} - 1} \oplus 48 \oplus 1) + 48$。
然后题目的几个要求都做到了,因为
子序列在操作二中已经出现,且保证前 $n+1$ 个字符中没有与 $A$ 相等的子串。
后面的操作中也不会再出现子串,因为不会出现 $A$ 的最后一个字符。
贴代码(给自己看的):
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
LL mod = 1e9 + 7;
template < typename T >
void read (T &x) {
x = 0; bool f = 0; char ch = getchar();
while (!isdigit (ch)) f ^= !(ch ^ 45), ch = getchar();
while (isdigit (ch)) x = (x << 1) + (x << 3) + (ch & 15), ch = getchar();
x = f ? -x : x;
}
LL qpow (LL a, LL b) {
LL res = 1;
for (; b; b >>= 1, a = a * a % mod)
if (b & 1) res = (res * a) % mod;
return res;
}
void solve() {
LL n, k;
read (n); read (k);
LL r1 = n * (n + 1), r2 = n * (n - 1);
r1 %= mod; r2 %= mod;
LL x1 = k + 1 >> 1, x2 = k >> 1;
LL res = (x1 * (r1 + mod - x1 + 1) % mod) + (x2 * (r2 + mod - x2 + 1) % mod);
if (res & 1) res = res * qpow (2, mod - 2) % mod;
else res = (res >> 1) % mod;
printf ("%lld", res); puts("");
}
int main() {
int T;
read (T);
while (T --)
solve();
return 0;
}
T1
#include <bits/stdc++.h>
using namespace std;
void solve() {
int n, m;
cin >> n >> m;
string st;
cin >> st;
if (n == m || n == 1 || (n == 2 && st[0] != st[1])) {
cout << "-1\n";
return ;
}
int id = st.size() - 1;
for (int i = st.size() - 1; i; i --) if (st[i] == st[i - 1]) id = i;
for (int i = 0; i < st.size(); i ++) {
if (id == i)
if (st[i] == '1') cout << '0';
else cout << '1';
cout << char (st[i]);
}
for (int i = 1; i < m - n; i ++) {
int x = st[st.size() - 1] ^ 48 ^ 1; x += 48;
cout << char(x);
}
cout << "\n";
}
int main() {
ios::sync_with_stdio (false);
cin.tie(0); cout.tie(0);
int T; cin >> T;
while (T --)
solve();
return 0;
}
T2