U140486 为了纪念逝去的julian
题目背景
**本题为纪念CSP2020S组T1断送OI生涯。**
~~本题为庆祝各位OIer凯旋而作。~~
在~~自作多情~~多方要求之下,有了这道题。
谨纪念自己的OI生涯。
题目描述
**下面资料部分引用于《中华人民共和国国家标准 GB/T 33661-2017 农历的编算和颁行》**
#### 术语和定义
------------
二十四节气 (twenty-four solar terms)
一个回归年内24个太阳地心视黄经等于 $15°$ 的整数倍的时刻的总称。每个时刻叫做一个节气,其名称见附录A。
中气 (principle term)
从冬至开始的二十四节气中逢奇序数的节气,
即:冬至、大寒、雨水、春分、谷雨、小满、夏至、大暑、处暑、秋分、霜降、小雪。
中气在农历编算中有确定月序以及安排闰月的重要作用。
(摘编自网络)当然当时的二十四节气跟现代是不一样的。那时由于天文的知识欠缺,采用按时间等分的平气。
然而由于地球绕太阳运行的轨道为椭圆形。故自清代开始,另定以冬至黄经270°起,太阳在黄道上每运行15度订为一个节气或中气。
24节气因而为24个特定的时刻,而非特定的24天。这种制订方式称为“定气法”。 实际中气的间隔由29天至32天。
朔日 (new moon day)
包含朔在内的农历日。
农历月 (Chinese calendar month)
根据农历编排规则确定的包含29个或30个农历日的时间间隔。
朔日为农历月的第一个农历日。
农历闰月 (Chinese calendar intercalary month)
根据农历置闰规则确定的某一个不包含中气的农历月。
农历年 (Chinese calendar year)
根据农历编排规则确定的包含12个或13个农历月的时间间隔。
冬至所在的农历月之后第2个(不计闰月)农历月为农历年的第一个农历月。
正月 (the first month of Chinese calendar)
农历年的第一个农历月。
农历平年 (Chinese calendar common year)
不包含闰月的农历年。一个农历平年包含12个农历月。
农历闰年 (Chinese calendar leap year)
包含闰月的农历年。一个农历闰年包含13个农历月。
天干 (celestial stem)
中国古代的一种文字记序符号:甲、乙、丙、丁、戊、己、庚、辛、壬、癸。循环使用。
地支 (terrestrial branch)
中国古代的一种文字记序符号:子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥。循环使用。
生肖 (Chinese zodiac)
与12地支一一对应的12种动物名称:鼠、牛、虎、兔、龙、蛇、马、羊、猴、鸡、狗、猪,通常用于纪年。
六十干支周 (sexagesimal cycle)
中国古代把天干和地支各循序取一字相配成一对干支,形成六十对干支组成的新的较长的计序符号系统,循环使用,通常用于纪年和纪日。干支名称顺序见附录B。
#### 农历的编排规则
------------
以北京时间为标准时间。
朔日为农历月的第一个农历日。
包含节气冬至在内的农历月为农历十一月。
如果从某个农历十一月开始到下一个农历十一月(不含)之间有13个农历月,则取其中最先出现的一个不包含中气的农历月为农历闰月。
农历十一月之后第2个(不计闰月)农历月为农历年的起始月。
#### 农历的表示方法
------------
在本题中,要求使用干支纪年法纪年,数序纪日法纪日。为简短题长,故只引用相应的部分。
#### 干支纪年法
按顺序用六十干支命名,从甲子年、乙丑年……到癸亥年,六十年一个循环,周而复始。
**干支纪年的循环参考时间:对应于北京时间公历1984年2月2日0时起到1985年2月19日24时截止的农历年为甲子年。**
#### 数序纪月法
即除闰月外,农历月按照其在农历年中的先后顺序分别用汉字命名如下:正月、二月、三月、四月、五月、六月、七月、八月、九月、十月、十一月、十二月,闰月采用在其**前一个农历月的名称**前加“闰”字的方法命名。
#### 数序纪日法
按照在其所属农历月中的顺序表示。
第1日到第10日依次用汉字纪为初一、初二……初十,
第11日到第20日依次纪为十一、十二……二十
第21日到第29日依次简纪为廿一、廿二……廿九,
第30日纪为三十。
#### 农历的颁行办法
------------
国家指定编历机构按年度编算农历日历的标准资料,其中应包含该年度内农历和公历的日期对照以及二十四节气。
中国科学院提前一年正式发布农历日历的年度标准资料。
公开发行的农历日历应依据农历日历的标准资料。
公元1912年1月1日至本标准生效之日期间的农历日历参考中国科学院紫金山天文台编算的农历日历。
#### 其他资料(引用自网络)
------------
农历年中月以朔望月长度 $29.5306$ 日为基础,所以大月为$ 30$ 日,小月为 $29$ 日。
为保证每月的头一天(初一)必须是朔日,就使得大小月的安排不固定,而需要通过严格的观测和计算来确定。
那么多长时间加一个闰月呢?最好的办法就是求出回归年日数与朔望月的日数的最小公倍数:我们希望m个回归年的天数与n个朔望月的天数相等,也就是应有等式:
$$\boxed{M×365.2422=N×29.5306}$$
求出
$$\boxed{\frac{M}{N}=\frac{29.5306}{365.2422}}$$
其对应的近似值为$\frac{3}{37}$,$\frac{5}{62}$,$\frac{19}{235}$,这也就说明,3年一闰,5年二闰,19年七闰,且农历基本上19年为一周期对应于公历同一时间。
由于闰月是需要经过推算的,所以每个闰月并不固定,具体的计算方法请参照“术语和定义”中农历闰月一栏。或者,在附录D中,我们给出了1-2000年所有的闰月。
当然,为了让题目更加友善~~毒瘤~~我们在附录C中给出了较为重要的农历日期。
#### 附录
------------
##### 附录A 二十四节气
以 太阳地心视黄经 $270°$起始,二十四节气依次为:
冬至 小寒 大寒 立春 雨水 惊蛰
春分 清明 谷雨 立夏 小满 芒种
夏至 小暑 大暑 立秋 处暑 白露
秋分 寒露 霜降 立冬 小雪 大雪
##### 附录B 干支顺序
```
string a[60];
a[0]="甲子";a[1]="乙丑";a[2]="丙寅";a[3]="丁卯";a[4]="戊辰";a[5]="己巳";
a[6]="庚午";a[7]="辛未";a[8]="壬申";a[9]="癸酉";a[10]="甲戌";a[11]="乙亥";
a[12]="丙子";a[13]="丁丑";a[14]="戊寅";a[15]="己卯";a[16]="庚辰";a[17]="辛巳";
a[18]="壬午";a[19]="癸未";a[20]="甲申";a[21]="乙酉";a[22]="丙戌";a[23]="丁亥";
a[24]="戊子";a[25]="己丑";a[26]="庚寅";a[27]="辛卯";a[28]="壬辰";a[29]="癸巳";
a[30]="甲午";a[31]="乙未";a[32]="丙申";a[33]="丁酉";a[34]="戊戌";a[35]="己亥";
a[36]="庚子";a[37]="辛丑";a[38]="壬寅";a[39]="癸卯";a[40]="甲辰";a[41]="乙巳";
a[42]="丙午";a[43]="丁未";a[44]="戊申";a[45]="己酉";a[46]="庚戌";a[47]="辛亥";
a[48]="壬子";a[49]="癸丑";a[50]="甲寅";a[51]="乙卯";a[52]="丙辰";a[53]="丁巳";
a[54]="戊午";a[55]="己未";a[56]="庚申";a[57]="辛酉";a[58]="壬戌";a[59]="癸亥";
```
##### 附录C 重要节日
农历正月初一 春节
农历正月十五 元宵节
农历二月初二 龙头节
农历三月初三 上巳节
清明节因在节气清明前后而不计在内
农历五月初五 端午节
农历七月初七 七夕节
农历七月十五 中元节
农历八月十五 中秋节
农历九月初九 重阳节
冬至节因在节气冬至前后而不计在内
农历十二月初八 腊八节
##### 附录D 闰月记录
详见附件
输入格式
输入数据为一行,表示一个合法的公历日期。
第一行三个整数 $Y$ $M$ $D$,分别表示该公历日期的年,月,日。
输出格式
输出仅一行,为一个字符串。
该字符串表示以干支纪年,数序纪月,数序纪日的农历日期。
特殊地,如果该农历日期在附录C中有对应的节日,请输出节日。
说明/提示
#### 数据规模与约定
对于 $50\%$的数据,该公历日期在2020年。
对于 $100\%$的数据,该公历日期在公元1~2000年。
实际上,目前题目及数据均尚不完善,所有的数据点均在2020年内。
#### 提示
一个用脚造数据的出题人如何给出五个数据点?