警示后人
查看原帖
警示后人
1288333
XURUIFAN楼主2025/6/21 11:11
前文。
  • 开long long!! 数据保证 year109year \le 10^9 ,没保证输入的 ri109r_i \le10^9 !!!并且个人建议在所有涉及加减乘除取模的地方全部开long long,否则喜提不知名原因 TLE on #10
  • 公元前年份绝对值变小,公元后年份绝对值变大。
  • 不存在公元(前) 00 年,以及 1582.10.51582.10.141582.10.5-1582.10.14的所有日期

下文针对采取纯数学的周期取模做法。

例如 1600.1.11600.1.1 以后的日期,其周期大致可分为:

  • 400400 年一周期,一周期长 146097146097 天;
  • 100100 年一周期,一周期长 3652436524 天;
  • 44 年一周期,一周期长 14611461 天;
  • 11 年一周期,一周期长 365/366365/366天。
  • 当你利用周期计算年份时,请注意 取模结果可能为 00 !!! 此时需要特殊处理,个人建议在计算完成后将日期加回一个周期的长度,年份减去一个周期。
  • 1582.10.151582.10.15 以后,周期处理时建议先暴力加到 1600.1.11600.1.1 再处理 400400 年一周期的情况,剩下的直接暴力,可以料见如果写法足够好,前者的循化次数至多为 16001582=181600-1582=18 次,后者由于 400400 年一个周期的情况都解决了,循环至多 400400 次,理论复杂度 O(400×Q)O(400\times Q),对于 Q105Q\le10^5 的数据范围轻松跑过。
  • 年份处理完毕后,当且仅当 r>dayir > day_i 时,你可以将 rr 减去第 ii 月的长度并进入第 i+1i+1 个月,否则你会输出诸如 00 44 10001000 的答案。

至于为什么不处理完 400400 年的周期后不继续处理 100100 年的周期,给一组数据:

1
2598007

正常输出是 31 12 2400,但如果处理 100100 的周期,由于这一天刚好是 400400 一周期中周期的最后一天,所以按照上文的逻辑,内存里日期数会是刚好 146097146097,但如果进一步处理 100100 年一周期的话,会变成 4×1004\times100+1+1 天,因为正常 100100 年中只有 2424 个闰年,但是第四个 100100 年会有 2525 个闰年,如果直接取模,输出是 1 1 2401

最后再丢几组数据上来,内含被删除的10天附近的日期、几个闰年、特殊日期、以及从某个测试点的数据中部分摘录的数据,然后推荐一个网站

2025/6/21 11:11
加载中...