题目描述

假设今天是星期日,那么过 aba^b 天之后是星期几?输入两个正整数 aa、bb(0<a⩽1000 < a \leqslant 100,0<b⩽100000 < b \leqslant 10000),输出一个英文星期名(Monday、Tuesday、Wednesday、Thursday、Friday、Saturday、Sunday)。样例输入 3 2000,样例输出 Tuesday。

思路

星期以 77 天为周期,答案只由 r=ab mod 7r = a^b \bmod 7 决定,用快速幂(边乘边取模)求出 rr,避免直接计算巨大的 aba^b。今天是星期日,把星期表按 Monday 开头存放,输出 week[r-1]:r=0r=0(过了整数个星期)时下标 −1-1 恰好取到末尾的 Sunday,无需特判。

参考代码

Python 版:

python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://rainboylvx
# rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-09-29 17:55
# update_at: 2026-09-29 17:55

import sys

WEEK = [  # 星期名,下标 = (a^b mod 7) - 1:0 → Monday … 6 → Sunday
    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday",
]


def solve() -> None:
    a, b = map(int, sys.stdin.buffer.read().split())

    r = pow(a, b, 7)  # 三参数 pow 即模意义快速幂,大指数也不需要展开
    print(WEEK[r - 1])  # r=0 表示整除 7,余 7 天一循环,仍是 Sunday


if __name__ == "__main__":
    solve()

C++ 版(同一算法):

cpp
/**
 * Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
 * rbook: -> https://rbook.roj.ac.cn  https://rbook2.roj.ac.cn
 * rainboy的学习导航网站: https://idx.roj.ac.cn
 * create_at: 2026-10-05 00:33
 * update_at: 2026-10-05 00:33
 */

#include <cstdio>

typedef long long ll;

// 星期表按 Monday 开头存放:下标 r-1 对应"过 r 天"后的星期
// r = 0 时下标 -1,week[-1] 在 C++ 中不合法,所以单独特判成 Sunday
const char *week[6] = {
    "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
};

ll a, b; // 题目输入:底数 a,指数 b

int main() {
    scanf("%lld %lld", &a, &b);

    // 快速幂求 a^b mod 7:把 b 按二进制位拆开,边乘边取模,中间值不会膨胀
    ll r = 1 % 7; // 注意 b 可能为 0 的写法习惯;本题 b>=1,1%7=1
    ll base = a % 7;
    while (b > 0) {
        if (b & 1) r = r * base % 7;
        base = base * base % 7;
        b >>= 1;
    }

    if (r == 0)
        printf("Sunday\n"); // a^b 是 7 的整数倍,正好过了整数个星期
    else
        printf("%s\n", week[r - 1]);
    return 0;
}