#G2006. 月历

    ID: 993 传统题 1000ms 512MiB 尝试: 7 已通过: 5 难度: 普及− 上传者: 标签>GESP二级分支嵌套格式化输出2026模拟

月历

题目描述

小 B 想打印一张月历。已知 yy 年 11 月 11 日是星期 ww(w=1w = 1 表示星期一,……,w=7w = 7 表示星期日),请打印出 yy 年 mm 月的月历。

各月天数:1,3,5,7,8,10,121, 3, 5, 7, 8, 10, 12 月有 3131 天;4,6,9,114, 6, 9, 11 月有 3030 天;22 月在闰年有 2929 天,在平年有 2828 天。闰年是指:能被 44 整除但不能被 100100 整除的年份,或者能被 400400 整除的年份。

月历的格式如下:

  • 第一行固定是表头 Mo Tu We Th Fr Sa Su,分别对应星期一到星期日;
  • 从第二行起,每行表示一周(从星期一到星期日),每一天占一个宽度为 22 的格子:日期是一位数时前面补一个空格,是两位数时直接输出;
  • 同一行相邻两个格子之间用一个空格隔开;
  • 这个月 11 号之前的那些格子是空的,每个空格子输出两个空格(它和后面的格子之间同样要有一个空格隔开);
  • 每一行在这一行最后一个日期之后立即换行,行末不要输出多余的空格。最后一个日期所在的那一行就是月历的最后一行。

输入格式

一行,三个整数 y,m,wy, m, w,用空格分隔。

输出格式

若干行,表示 yy 年 mm 月的月历。

样例 #1

样例输入 #1

2026 2 4

样例输出 #1

Mo Tu We Th Fr Sa Su
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28

样例解释

20262026 年 11 月 11 日是星期四。11 月有 3131 天,31=4×7+331 = 4 \times 7 + 3,所以 22 月 11 日比 11 月 11 日往后推 33 天,是星期日,排在第一行的最后一格,它前面有 66 个空格子。

20262026 年不是闰年,22 月有 2828 天,最后一行到 2828 号(星期六)就结束,后面不再输出空格。

提示

数据范围

  • 对于 30%30\% 的数据:m=1m = 1;
  • 对于 60%60\% 的数据:yy 不是闰年;
  • 对于 100%100\% 的数据:1900≤y≤21001900 \le y \le 2100,1≤m≤121 \le m \le 12,1≤w≤71 \le w \le 7,且输入与真实日历一致。

提示

  • 先用循环把 1∼m−11 \sim m-1 月的天数依次「加到星期上」再对 77 取余,就能求出 mm 月 11 日是星期几。
  • 19001900 年和 21002100 年都不是闰年,20002000 年是闰年。