每一年都会有很多特殊的日子,而有一种特殊的方式叫做“吻合日”。“吻合日”的定义为:如果某日的日期对10取模后的值等于该日的星期值(周日视为7),则称该日为“吻合日”。如2021年3月3日为周三,是“吻合日”。Jaanai想要你帮她求出在一段时间范围内的“吻合日”的数量及每个星期值下“吻合日”的具体数量。 输入格式: 包含m组数据(m不给出),每组数据有两行: 第一行三个数,代表起始年月日;(含) 第二行三个数,代表终止年月日。(不含) 输出格式: 共m行,每行八个整数,第一个整数代表给出的时间范围内“吻合日”的总数,第2-8个整数代表周一至周日分别的“吻合日”数量,整数之间由一个空格分隔。 行末没有多余空格,但是有换行符。
时间: 2023-11-22 21:53:30 浏览: 74
行业文档-设计装置-一种带有抽取式便写纸的笔.zip
这道题目可以使用蔡勒公式求出某一天是星期几,然后再判断是否为“吻合日”。
解法如下:
```python
def is_leap_year(year):
# 判断是否为闰年
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)
def day_of_week(year, month, day):
# 蔡勒公式
if month < 3:
year -= 1
month += 12
c, y = divmod(year, 100)
w = (c // 4 - 2 * c + y + y // 4 + 13 * (month + 1) // 5 + day - 1) % 7
return w + 1
while True:
try:
# 读入数据
start_year, start_month, start_day = map(int, input().split())
end_year, end_month, end_day = map(int, input().split())
# 计算吻合日
total = 0
count = [0] * 7
for year in range(start_year, end_year):
for month in range(1, 13):
for day in range(1, 32):
if day > 28 and month == 2:
if not is_leap_year(year) and day == 29:
break
if day == 30:
break
if day > 30 and month in [4, 6, 9, 11]:
break
if day_of_week(year, month, day) == day % 10:
total += 1
count[day_of_week(year, month, day) - 1] += 1
# 输出结果
print(total, end=' ')
print(*count)
except:
break
```
时间复杂度为 $O((y_2 - y_1) \times 12 \times 31)$,可以通过本题。
阅读全文