- 开long long!! 数据保证 year≤109 ,没保证输入的 ri≤109 !!!并且个人建议在所有涉及加减乘除取模的地方全部开
long long
,否则喜提不知名原因 TLE on #10。
- 公元前年份绝对值变小,公元后年份绝对值变大。
- 不存在公元(前) 0 年,以及 1582.10.5−1582.10.14的所有日期
下文针对采取纯数学的周期取模做法。
例如 1600.1.1 以后的日期,其周期大致可分为:
- 400 年一周期,一周期长 146097 天;
- 100 年一周期,一周期长 36524 天;
- 4 年一周期,一周期长 1461 天;
- 1 年一周期,一周期长 365/366天。
- 当你利用周期计算年份时,请注意 取模结果可能为 0 !!! 此时需要特殊处理,个人建议在计算完成后将日期加回一个周期的长度,年份减去一个周期。
- 1582.10.15 以后,周期处理时建议先暴力加到 1600.1.1 再处理 400 年一周期的情况,剩下的直接暴力,可以料见如果写法足够好,前者的循化次数至多为 1600−1582=18 次,后者由于 400 年一个周期的情况都解决了,循环至多 400 次,理论复杂度 O(400×Q),对于 Q≤105 的数据范围轻松跑过。
- 年份处理完毕后,当且仅当 r>dayi 时,你可以将 r 减去第 i 月的长度并进入第 i+1 个月,否则你会输出诸如 0 4 1000 的答案。
至于为什么不处理完 400 年的周期后不继续处理 100 年的周期,给一组数据:
1
2598007
正常输出是 31 12 2400
,但如果处理 100 的周期,由于这一天刚好是 400 一周期中周期的最后一天,所以按照上文的逻辑,内存里日期数会是刚好 146097,但如果进一步处理 100 年一周期的话,会变成 4×100 年 +1 天,因为正常 100 年中只有 24 个闰年,但是第四个 100 年会有 25 个闰年,如果直接取模,输出是 1 1 2401
。
最后再丢几组数据上来,内含被删除的10天附近的日期、几个闰年、特殊日期、以及从某个测试点的数据中部分摘录的数据,然后推荐一个网站。