0%

2024 蓝桥杯省赛 python B组 解题报告

题目传送门

A 穿越时空之门

Solution

枚举,按题意暴力计算即可。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ans = 0
for i in range(1, 2025):
suma = sumb = 0
num = i
while num:
suma += num & 1
num >>= 1
num = i
while num:
sumb += num % 4
num //= 4
if suma == sumb:
ans += 1
print(ans)

B 数字串个数

Solution

容斥定理。数字总数 - 不含 33 的数字个数 - 不含 77 的数字个数 + 不含 3377 的数字个数。

由乘法原理易得答案,使用快速幂进行优化。

Code

1
2
3
4
5
6
7
8
9
10
11
12
mod = 10 ** 9 + 7

def fst(a, b):
res = 1
while b:
if b & 1:
res = res * a % mod
a = a * a % mod
b >>= 1
return res

print((fst(9, 10000) + fst(7, 10000) - 2 * fst(8, 10000) + 10 * mod) % mod)

C 连连看

Solution

注意到 Ai,j1000A_{i, j} \le 1000,考虑枚举矩阵的所有斜线,然后开桶记录元素的出现次数。

Code

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
47
48
49
50
51
52
53
54
55
56
57
58
59
N = 1005
a = [[0 for _ in range(N)] for _ in range(N)]
vis = [[0 for _ in range(N)] for _ in range(N)]
d = [[1, 1],
[1, -1],
[-1, -1]]
ans = 0


if __name__ == '__main__':

n, m = map(int, input().split())
for i in range(n):
a[i] = list(map(int, input().split()))

for j in range(m): # 以上边界为起点
for k in range(2):
f = [0 for _ in range(N)]
x, y = 0, j
f[a[x][y]] = 1
x += d[k][0]
y += d[k][1]
while 0 <= x < n and 0 <= y < m:
ans += f[a[x][y]]
f[a[x][y]] += 1
x += d[k][0]
y += d[k][1]
vis[x - d[0][k]][y - d[1][k]] += 1

for i in range(1, n): # 以右边界为起点
for k in range(1, 3):
if vis[i][m - 1] == 1 and k == 2:
break
f = [0 for _ in range(N)]
x, y = i, m - 1
f[a[x][y]] = 1
x += d[k][0]
y += d[k][1]
while 0 <= x < n and 0 <= y < m:
ans += f[a[x][y]]
f[a[x][y]] += 1
x += d[k][0]
y += d[k][1]

for i in range(min(n, m) - 1): # 以下边界为起点
k = 3
f = [0 for _ in range(N)]
x, y = i, m - 1
f[a[x][y]] = 1
x += d[k][0]
y += d[k][1]
while 0 <= x < n and 0 <= y < m:
ans += f[a[x][y]]
f[a[x][y]] += 1
x += d[k][0]
y += d[k][1]

print(ans * 2)