AtCoder Regular Contest 148
A. mod M ∘ \color{#804000}\texttt{A. mod M}\color{red}~\circ A. mod M ∘
/*
name: mod M
id: AT_arc148_a
date: 2023/01/24
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, a[N];
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; ++ i){
scanf("%d", &a[i]);
}
int gg = abs(a[1] - a[2]);
for(int i = 3; i <= n; ++ i){
gg = __gcd(gg, abs(a[i-1] - a[i]));
}
if(gg != 1){
puts("1");
} else {
puts("2");
}
return 0;
}
B. dp ∘ \color{#008000}\texttt{B. dp}\color{red}~\circ B. dp ∘
/*
name: dp
id: AT_arc148_b
date: 2023/01/24
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
int n, l;
char s[N], t[N], ans[N];
bool cmp(){
for(int i = 1; i <= n; ++ i){
if(t[i] < ans[i]){
return true;
}
if(t[i] > ans[i]){
return false;
}
}
return false;
}
int main(){
scanf("%d%s", &n, s+1);
for(int i = 1, cnt = 0; i <= n; ++ i){
if(!l && s[i] == 'p'){
l = i;
break;
}
}
for(int i = l; i <= n; ++ i){
for(int j = 1; j < l; ++ j){
t[j] = s[j];
}
for(int j = l, q = i; j <= i; ++ j, -- q){
t[j] = (s[q] == 'd' ? 'p' : 'd');
}
for(int j = i+1; j <= n; ++ j){
t[j] = s[j];
}
if((ans[1] != 'p' && ans[1] != 'd') || cmp()){
for(int j = 1; j <= n; ++ j){
ans[j] = t[j];
}
}
}
for(int i = 1; i <= n; ++ i){
putchar(ans[i]);
}
puts("");
return 0;
}
C. Lights Out on Tree ∘ \color{#00B0B0}\texttt{C. Lights Out on Tree}\color{red}~\circ C. Lights Out on Tree ∘
等价于两个端点不同的边的数量。
/*
name: Lights Out on Tree
id: AT_arc148_c
date: 2023/01/24
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, q, fa[N], val[N], col[N], k[N];
vector<int> g[N];
int main(){
scanf("%d%d", &n, &q);
for(int i = 2; i <= n; ++ i){
int x;
scanf("%d", &x);
g[x].push_back(i);
fa[i] = x;
}
g[0].push_back(1);
fa[1] = 0;
for(int i = 1; i <= q; ++ i){
int m, ans = 0;
scanf("%d", &m);
for(int j = 1; j <= m; ++ j){
scanf("%d", &k[j]);
col[k[j]] = 1;
if(col[k[j]] != col[fa[k[j]]]){
++ ans;
} else {
-- ans;
}
ans += g[k[j]].size() - val[k[j]];
++ val[fa[k[j]]];
}
printf("%d\n", ans);
for(int j = 1; j <= m; ++ j){
col[k[j]] = 0;
-- val[fa[k[j]]];
}
}
return 0;
}
D. mod M Game ∘ \color{#B0B000}\texttt{D. mod M Game}\color{red}~\circ D. mod M Game ∘
不会证,但是过了。。。
考虑每个数 m o d m \bmod m modm 出现的次数,如果都为偶数那么显然 bob 获胜。当 m m m 为奇数的时候也确实是这么做。
当 m m m 为偶数时,统计每个数 m o d m / 2 \bmod m/2 modm/2 出现的次数,并统计 m / 2 m/2 m/2 的个数。如果均为偶数则 bob 获胜,否则 alice。
/*
name: mod M Game
id: AT_arc148_d
date: 2023/01/24
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10;
int n, m, a[N];
map<int, int> mp;
int main(){
scanf("%d%d", &n, &m);
n *= 2;
for(int i = 1; i <= n; ++ i){
scanf("%d", &a[i]);
++ mp[a[i]%m];
}
int cnt = 0;
bool flg = true;
for(int i = 1; i <= n; ++ i){
if(m & 1){
if(mp[a[i]%m] & 1){
flg = false;
break;
}
} else {
if((mp[a[i]%m] + mp[(a[i]+m/2)%m]) & 1){
flg = false;
break;
} else if(mp[a[i]%m] & 1){
++ cnt;
mp[a[i]%m] = mp[(a[i]+m/2)%m] = 0;
}
}
}
puts(flg && !(cnt & 1) ? "Bob" : "Alice");
return 0;
}
E. ≥ K △ \color{#FF8000}\texttt{E.} \geq\texttt{K}\color{red}~\vartriangle E.≥K △
不会。
/*
name: ≥ K
id: AT_arc148_e
date: 2023/01/24
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
const ll P = 998244353;
int n, k, a[N], s = 1;
ll fac[N], ans = 1;
map<int, int> m;
ll qp(ll a, ll b){
ll ans = 1;
while(b){
if(b & 1){
ans = ans * a % P;
}
a = a * a % P;
b >>= 1;
}
return ans;
}
int main(){
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++ i){
scanf("%d", &a[i]);
++ m[a[i]];
}
fac[0] = 1;
for(int i = 1; i <= n; ++ i){
fac[i] = fac[i-1] * i % P;
}
sort(a + 1, a + n + 1);
for(int i = 1, j = n; i <= j;){
ans = ans * s % P;
if(a[i] + a[j] < k){
-- s;
++ i;
} else {
++ s;
-- j;
}
}
for(auto& [qwqbro, v] : m){
ans = ans * qp(fac[v], P-2) % P;
}
printf("%lld\n", ans);
return 0;
}