CSP-S2020第一题(儒略日)题解

题目
题目传送门
解题思路
在题目这种历法中,日期计算以400年为周期,每400年都有恰好146097天。
我们可以预处理出400年内的情况,将年份模400即可快速得到答案。
加速技巧
对于“格里高利历”,以1200年1月1日为起始日,r减去2159351天
r⩽2299160即为儒略历。公元前x年视为(1-x)年。
参考代码

#include <bits/stdc++.h>
using namespace std;
const int N = 146097, A = 2299160, B = 2159351, C = 1461, D = 4712;
int y[N], m[N], d[N];
inline int get(int y, int m) {
    if (m == 2) {
		return (y % 4) ? 28 : (y % 100) ? 29 : y % 400 ? 28 : 29;
	}
    return (m == 4 || m == 6 || m == 9 || m == 11) ? 30 : 31;
}
void init() {
	m[0] = d[0] = 1;
    for(int i = 1; i < N; ++i) {
        d[i] = d[i - 1] + 1; m[i] = m[i - 1]; y[i] = y[i - 1];
        if (d[i] > get(y[i], m[i])) {
			++m[i]; d[i] = 1;
		}
        if (m[i] > 12) {
			++y[i]; m[i] = 1;
		} 
    }
}
int main() {
	init();
    int T; cin >> T;
    while (T--) {
        long long n, t; cin >> n;
        if (n > A) {
            n -= B; t = n / N * 400 + 1200; n %= N;
        } else {
            t = n / C * 4 - D; n %= C;
        }
        if (t + y[n] > 0) {
        	cout << d[n] << ' ' << m[n] << ' ' << t + y[n] << '\n';
        } else {
        	cout << d[n] << ' ' << m[n] << ' ' << 1 - t - y[n] << " BC\n";
        }
    }
    return 0;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蒟蒻一枚

谢谢鸭~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值