原题链接
关于我切了儒略日这件事。
这玩意真的毒瘤。。
众所周知,这是一道 b i g 11451 4 1919810 big^{114514^{1919810}} big1145141919810 模拟,虽然只是一道CSPS的T1,但确实很难写,某学会又特地卡了暴力……
所以我们要学会优雅的暴力哈哈哈哈哈哈哈……(嚣张的笑声)
《关于优雅》
好吧不扯了,现在开始来看看这个麻烦而又有趣的大模拟咯。
首先可以想到,它不是分两种历法吗,我们就直接分开讨论。
首先是儒略历部分。由题可知,我们可以先将所有四年都噶掉剔除开,直接将其和年份挂钩。
yy=-4713; mm=1; dd=1;
tmp=r; //输入的儒略日
yy+=4*(tmp/1461);
tmp%=1461;
剩下的天数显然是不足4年,由题可知,BC4713是闰年,所以若干个四年后依然是闰年。求出tmp
还有多少年,再一次修改年份。
if(tmp>=366){
yy+=1+(tmp-366)/365; //先将闰年分离开
tmp=(tmp-366)%365;
}
此时注意,根据题面,公元零年是不存在的,我们把它噶掉(迫真)
if(yy>=0) ++yy; //关于公元零年,它死了
最后根据提议对月份和日期进行修改即可。当然,由于天文学界的良心,儒略日是从一个闰年的1月1日开始算的,所以不需要考虑月份和日期的“进位”
while(tmp>=mn[mm]+(mm==2 && (yy<0 && (abs(yy)%4==1) || (yy>0 && yy%4==0)))){
tmp-=mn[mm]+(mm==2 && (yy<0 && (abs(yy)%4==1) || (yy>0 && yy%4==0)));
++mm; //此处条件看题
}
dd+=tmp; //加就完了
总结:
yy=-4713; mm=1; dd=1;
tmp=r; //输入的儒略日
yy+=4*(tmp/1461);
tmp%=1461;
if(tmp>=366){
yy+=1+(tmp-366)/365; //先将闰年分离开
tmp=(tmp-366)%365;
}
if(yy>=0) ++yy; //关于公元零年,它死了
while(tmp>=mn