当前位置:首页>python>第十七届蓝桥杯大赛软件赛省赛Python大学 B组原题+解答!

第十七届蓝桥杯大赛软件赛省赛Python大学 B组原题+解答!

  • 2026-09-20 14:59:42
第十七届蓝桥杯大赛软件赛省赛Python大学 B组原题+解答!

试题A: 和平干饭日

本题总分:5 分

【问题描述】

铲屎官小蓝家里养了26 只体型巨大的缅因猫。为了给它们增加生活乐趣,小蓝海淘了一台带有人工智能的 “奇葩喂食器”。

这台喂食器的出粮规则极其反人类:它每天吐出的猫粮颗粒总数,是将从1 开始的自然数依次拼接而成的整数。

具体来说:

l第1 天,喂食器吐出 1 颗猫粮;

l第2 天,喂食器吐出 12 颗猫粮(将 1 和 2 拼在一起);

l第3 天,喂食器吐出 123 颗猫粮;

l……

如果某天吐出的猫粮总数,能够被这26 只猫完全平分(即每只猫分到的颗粒数一模一样),它们就会相安无事,这一天被称为 “和平干饭日”。如果不能被完全平分,它们就会为了抢夺残粮而大打出手。

现在,喂食器的运行计划已经设定了整整2026 天。请你忧心忡忡的小蓝算一算,在这 2026 天里,总共有多少天是 “和平干饭日”?

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

试题 A:和平干饭日(结果填空)

答案:76

res = 0now = 0for i in range(1, 2027):    cnt = len(str(i))    now = (now * (10 ** cnt) + i) % 26    if now == 0:        res += 1print(res)

试题 B:干涉条纹(结果填空)

答案:225964689(模 998244353)

MOD = 998244353A = 20269876543210B = 20260123456789max_s = A + Bimport mathR = int(math.isqrt(max_s))ans = 0for k in range(0, R + 1):    s = k * k    low = max(0, s - B)    high = min(A, s)    if low > high:        continue    ans += high - low + 1    ans %= MODprint(ans % MOD)
试题 C:定制展示盘(编程题)
import mathimport sysdef solve():    input = sys.stdin.read    data = input().split()    T = int(data[0])    for i in range(1, T + 1):        n = int(data[i])        if n <= 4:            print(4)            continue        res = float('inf')        r = int(math.isqrt(n))        for a in range(2, r + 2):            b = (n + a - 1) // a            if b >= 2:                res = min(res, a * b)        print(res)solve()
试题 D:密室逃脱开关谜题(编程题)
import sysfrom collections import dequedef main():    input = sys.stdin.read().split()    idx = 0    t = int(input[idx])    idx += 1    for _ in range(t):        n = int(input[idx])        m = int(input[idx + 1])        idx += 2        adj = [[] for _ in range(m)]        for i in range(n):            x = i % m            y = (2 * i) % m            adj[x].append(i)            adj[y].append(i)        vis = [False] * m        q = deque()        q.append(0)        vis[0] = True        cnt = 0        while q:            u = q.popleft()            cnt += 1            for v in adj[u]:                if not vis[v]:                    vis[v] = True                    q.append(v)        if cnt == m:            print(m - 1)        else:            print(-1)if __name__ == "__main__":    main()
试题 E:奇偶博弈(编程题)
import sysdef main():    input = sys.stdin.read    data = input().split()    ptr = 0    T = int(data[ptr])    ptr += 1    for _ in range(T):        N = int(data[ptr])        ptr += 1        w = list(map(int, data[ptr:ptr + N]))        ptr += N        s = 0        for x in w:            s ^= (x // 2)        print("L" if s != 0 else "Q")if __name__ == "__main__":    main()
试题 F:蓝小圈(并查集 + 懒标记)
import syssys.setrecursionlimit(1 << 25)def main():    input = sys.stdin.read    data = input().split()    idx = 0    N = int(data[idx])    Q = int(data[idx + 1])    idx += 2    parent = list(range(N + 1))    add = [0] * (N + 1)    val = [0] * (N + 1)    def find(u):        if parent[u] != u:            parent[u] = find(parent[u])        return parent[u]    out = []    for __ in range(Q):        tp = int(data[idx])        if tp == 1:            X = int(data[idx + 1])            Y = int(data[idx + 2])            idx += 3            rx = find(X)            ry = find(Y)            if rx != ry:                parent[ry] = rx        elif tp == 2:            X = int(data[idx + 1])            A = int(data[idx + 2])            idx += 3            val[X] += A        elif tp == 3:            X = int(data[idx + 1])            A = int(data[idx + 2])            idx += 3            rx = find(X)            add[rx] += A        elif tp == 4:            X = int(data[idx + 1])            idx += 2            rx = find(X)            out.append(str(val[X] + add[rx]))    print('\n'.join(out))if __name__ == "__main__":    main()
试题 G:星光共鸣(DP)
MOD = 10**9 + 7def main():    import sys    n, k = map(int, sys.stdin.readline().split())    max_k = k    dp = [[0] * (max_k + 2) for _ in range(n + 2)]    dp[0][0] = 1    for i in range(n):        for j in range(max_k + 1):            if dp[i][j] == 0:                continue            dp[i + 1][j] = (dp[i + 1][j] + dp[i][j]) % MOD            nj = j + (i + 1)            if nj > max_k:                nj = max_k            dp[i + 1][nj] = (dp[i + 1][nj] + dp[i][j]) % MOD    total = pow(2, n, MOD)    ans = (total - dp[n][0] + MOD) % MOD    print(ans)if __name__ == "__main__":    main()
试题 H:位数求和(单调栈)
MOD = 998244353def main():    import sys    input = sys.stdin.read    data = input().split()    n = int(data[0])    a = list(map(int, data[1:n + 1]))    a = [0] + a    L = [0] * (n + 2)    R = [0] * (n + 2)    st = []    for i in range(1, n + 1):        while st and a[st[-1]] <= a[i]:            st.pop()        L[i] = st[-1] if st else 0        st.append(i)    st = []    for i in range(n, 0, -1):        while st and a[st[-1]] < a[i]:            st.pop()        R[i] = st[-1] if st else (n + 1)        st.append(i)    def get_len(x):        if x == 0:            return 1        return len(str(x))    res = 0    for i in range(1, n + 1):        lc = i - L[i]        rc = R[i] - i        tot = lc * rc        le = get_len(tot)        res = (res + a[i] % MOD * le) % MOD    print(res % MOD)if __name__ == "__main__":    main()

如果你正在学习python,这些Python资料、数据分析、Python从入门到实践第三版pdf书籍、Python+Pycharm安装包&永久激活插件、直播课程,可以在这里免费领取哈👇

最新文章

随机文章