AtCoder Beginner Contest 456 参加记录与解答示例 (A、D题)

发布: (2026年5月2日 GMT+8 22:25)
3 分钟阅读
原文: Dev.to

Source: Dev.to

Problem A (Score: 100)

Statement
一个 6 面的骰子掷三次。每个面上的数字为 1 到 6。
设 (X) 为 1 到 20 之间的整数。
三次掷骰子的和的取值范围是 3 到 18。若 (X) 落在此范围内,输出 "Yes";否则输出 "No"

X = int(input())
if 3 <= X <= 18:
    print("Yes")
else:
    print("No")

Problem B (Score: 200)

Statement
给出三颗骰子。第 (i) 颗骰子的第 (j) 面显示整数 (A_{i,j})( 1 ≤ (A_{i,j}) ≤ 6 )。每个面出现的概率为 (\frac{1}{6})。
计算这三颗骰子出现数字 4、5、6(任意顺序)的概率。

A = list(map(int, input().split()))
B = list(map(int, input().split()))
C = list(map(int, input().split()))

A4 = A.count(4)
A5 = A.count(5)
A6 = A.count(6)
B4 = B.count(4)
B5 = B.count(5)
B6 = B.count(6)
C4 = C.count(4)
C5 = C.count(5)
C6 = C.count(6)

ans1 = A4 * B5 * C6 / 6**3
ans2 = A4 * B6 * C5 / 6**3
ans3 = A5 * B4 * C6 / 6**3
ans4 = A6 * B4 * C5 / 6**3
ans5 = A5 * B6 * C4 / 6**3
ans6 = A6 * B5 * C4 / 6**3

ans = ans1 + ans2 + ans3 + ans4 + ans5 + ans6
print(ans)

Problem C (Score: 300)

Statement
给定仅由 abc 组成的字符串 (S)( (1 \le |S| \le 3 \times 10^5) )。
统计不含两个相同字符相邻出现的子串数量。输出结果对 (998244353) 取模。

S = list(input())
ans = 0
len_count = 0
prev_char = "x"

for i in range(len(S)):
    if S[i] == prev_char:
        len_count = 0
    len_count += 1
    ans += len_count
    ans %= 998244353
    prev_char = S[i]

print(ans)

Problem D (Score: 400)

Statement
给定仅由 abc 组成的字符串 (S)( (1 \le |S| \le 3 \times 10^5) )。
统计最后一个字符为 abc 的子序列数量。在扫描字符串时使用类似 DP 的更新方式,结果对 (998244353) 取模。

S = list(input())
A = 0
B = 0
C = 0

for i in range(len(S)):
    if S[i] == "a":
        A += 1 + B + C
        A %= 998244353
    if S[i] == "b":
        B += 1 + A + C
        B %= 998244353
    if S[i] == "c":
        C += 1 + A + B
        C %= 998244353

ans = (A + B + C) % 998244353
print(ans)
0 浏览
Back to Blog

相关文章

阅读更多 »

Python 入门指南

今天我开始学习 Python,并且探索了一些基本概念,这些概念帮助我了解 Python 在幕后是如何实际工作的。Python 是什么?...

FastAPI 快速入门 2026

什么是 FastAPI?FastAPI 是一个现代的 Python 框架,用于构建具有高性能和最少样板代码的 RESTful API。到 2026 年,它已经成为行业……