Codeforces Round #630 (Div.2)

比赛链接 / 官方题解链接

A. Exercising Walk

Solution

左右方向和上下方向分别考虑,以 $a>b$ 为例,最优走法显然是 左-右-左-右-……,所以终止位置在初始位置左边 $a-b$ 处,其余方向同理。

注意特判一步都不能走的情况。

Code

>folded
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<bits/stdc++.h>

using namespace std;

template<typename T>void read(T&x){x=0;int fl=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')
fl=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}x*=fl;}
template<typename T,typename...Args>inline void read(T&t,Args&...args){read(t);read(args...);}

typedef long long LL;

int T, a, b, c, d, x, y, x_1, y_1, x_2, y_2;

int main(){
read(T);
while(T--){
read(a, b, c, d);
read(x, y, x_1, y_1, x_2, y_2);
if(x - (a - b) < x_1 || x - (a - b) > x_2) puts("NO");
else if(y - (c - d) < y_1 || y - (c - d) > y_2) puts("NO");
else if(a == b && a > 0 && x_1 == x_2) puts("NO");
else if(c == d && c > 0 && y_1 == y_2) puts("NO");
else puts("YES");
}
return 0;
}

B. Composite Coloring

Solution

把每个数染成其最小质因数的颜色,小于 $\sqrt{1000}$ 的质数正好 $11$ 个。

Code

>folded
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<bits/stdc++.h>

using namespace std;

template<typename T>void read(T&x){x=0;int fl=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')
fl=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}x*=fl;}
template<typename T,typename...Args>inline void read(T&t,Args&...args){read(t);read(args...);}

typedef long long LL;

const int N = 1005;

int T, n, a, col[N], id;
int p[15] = {-1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31};
int c[15];

int main(){
read(T);
while(T--){
id = 0;
memset(col, 0, sizeof col);
memset(c, 0, sizeof c);
read(n);
for(int i = 1; i <= n; i++){
read(a);
for(int j = 1; j <= 11; j++){
if(a % p[j] == 0){
if(c[j]) col[i] = c[j];
else col[i] = c[j] = ++id;
break;
}
}
}
printf("%d\n", id);
for(int i = 1; i <= n; i++)
printf("%d ", col[i]);
puts("");
}
return 0;
}

C. K-Complete Word

Solution

周期性+对称性=一个周期内部对称。

Code

>folded
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<bits/stdc++.h>

using namespace std;

template<typename T>void read(T&x){x=0;int fl=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')
fl=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}x*=fl;}
template<typename T,typename...Args>inline void read(T&t,Args&...args){read(t);read(args...);}

typedef long long LL;
typedef pair<int, int> pii;
#define mp(x, y) make_pair(x, y)
#define pb(x) emplace_back(x)

const int N = 200005;

int T, n, k, cnt[30];
char s[N];

int main(){
read(T);
while(T--){
read(n, k);
scanf("%s", s+1);
int ans = 0;
for(int i = 1; i <= (k + 1) / 2; i++){
int tot = 0;
memset(cnt, 0, sizeof cnt);
for(int j = i; j <= n; j += k)
cnt[s[j]-'a']++, tot++;
if(i != k - i + 1){
for(int j = k - i + 1; j <= n; j += k)
cnt[s[j]-'a']++, tot++;
}
int mark = -1, mx = -1;
for(int j = 0; j <= 'z'-'a'; j++){
if(mx < cnt[j]){
mark = j;
mx = cnt[j];
}
}
ans += tot - mx;
}
printf("%d\n", ans);
}
return 0;
}

D. Walk on Matrix

Solution

设 $k$ 有 $b$ 位,$kk=(1<<b)|k$, 我构造的是:$\begin{pmatrix} kk & k & 0\\ kk & k & 0\\ 1<<b & kk & k \\\end{pmatrix}$.

但事实上,$\begin{pmatrix} 2^{17}+k & 2^{17} & 0\\ k & 2^{17}+k & k\\ \end{pmatrix}$ 足以。

Code

>folded
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<bits/stdc++.h>

using namespace std;

template<typename T>void read(T&x){x=0;int fl=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')
fl=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}x*=fl;}
template<typename T,typename...Args>inline void read(T&t,Args&...args){read(t);read(args...);}

typedef long long LL;

int main(){
int k;
read(k);
if(!k){
puts("1 1");
puts("1");
return 0;
}
int b = 0;
while((k >> b) != 0) b++;
int kk = (1 << b) | k;
puts("3 3");
printf("%d %d %d\n", kk, k, 0);
printf("%d %d %d\n", kk, k, 0);
printf("%d %d %d\n", 1 << b, kk, k);
return 0;
}

E. Height All the Same

Solution

手玩一些例子,可以发现一些结论:

  • 高度不重要,奇偶性是关键,所以我们在推结论时可以想象成平面上凸起一些高度为 $1$ 的小块。
  • 若 $n\cdot m$ 为奇数,无论初始情况是怎么样的,都可以达到目标。
  • 若 $n\cdot m$ 为偶数,若平面上凸起小块是奇数个,无法达成目标;否则,一定可以达成目标。

所以,对于奇数情况,答案就是 $(R-L+1)^{nm}$;对于偶数情况,我们要保证初始时所有高度之和为偶数,即选出偶数个位置放奇数,剩下偶数个位置放偶数。设 $[L,R]$ 内有 $a$ 个奇数,$b$ 个偶数,则答案为 $\sum\limits_{i=0}^{\frac{nm}{2}}C_{nm}^{2i}a^{2i}b^{nm-2i}=\frac{(b+a)^{nm}+(b-a)^{nm}}{2}$.

Code

>folded
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include<bits/stdc++.h>

using namespace std;

template<typename T>void read(T&x){x=0;int fl=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')
fl=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}x*=fl;}
template<typename T,typename...Args>inline void read(T&t,Args&...args){read(t);read(args...);}

typedef long long LL;

const LL MOD = 998244353;

LL n, m, L, R;

inline LL fpow(LL bs, LL idx){
bs %= MOD;
LL res = 1;
while(idx){
if(idx & 1) (res *= bs) %= MOD;
(bs *= bs) %= MOD;
idx >>= 1;
}
return res;
}

int main(){
read(n, m, L, R);
if((n * m) & 1)
printf("%lld\n", fpow(R - L + 1, n * m));
else{
LL a = (R - L + 1) / 2 + ((R - L + 1) % 2 && L % 2);
LL b = (R - L + 1) / 2 + ((R - L + 1) % 2 && L % 2 == 0);
printf("%lld\n", (fpow(b - a, n * m) + fpow(b + a, n * m)) * (MOD + 1) / 2 % MOD);
}
return 0;
}
作者

xyfJASON

发布于

2020-04-01

更新于

2020-12-20

许可协议

评论