A 穿越时空之门
Solution
枚举,按题意暴力计算即可。
Code
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
容斥定理。数字总数 - 不含 的数字个数 - 不含 的数字个数 + 不含 和 的数字个数。
由乘法原理易得答案,使用快速幂进行优化。
Code
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
注意到 ,考虑枚举矩阵的所有斜线,然后开桶记录元素的出现次数。
Code
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)