题目传送门

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

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

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

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

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

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)