首页 > 其他分享 >洛谷 P7075 [CSP-S2020] 儒略日

洛谷 P7075 [CSP-S2020] 儒略日

时间:2023-09-28 22:45:33浏览次数:40  
标签:10 12 洛谷 int 儒略 高利 3131 P7075

P7075 [CSP-S2020] 儒略日

1.题目描述

为了简便计算,天文学家们使用儒略日(Julian day)来表达时间。所谓儒略日,其定义为从公元前 4713 年 1 月 1 日正午 12 点到此后某一时刻间所经过的天数,不满一天者用小数表达。若利用这一天文学历法,则每一个时刻都将被均匀的映射到数轴上,从而得以很方便的计算它们的差值。

现在,给定一个不含小数部分的儒略日,请你帮忙计算出该儒略日(一定是某一天的中午 12 点)所对应的公历日期。

我们现行的公历为格里高利历(Gregorian calendar),它是在公元 1582 年由教皇格里高利十三世在原有的儒略历(Julian calendar)的基础上修改得到的(注:儒略历与儒略日并无直接关系)。具体而言,现行的公历日期按照以下规则计算:

  1. 公元 1582 年 10 月 15 日(含)以后:适用格里高利历,每年一月 3131 天、 二月 2828 天或 2929 天、三月 3131 天、四月 3030 天、五月 3131 天、六月 3030 天、七月 3131 天、八月 3131 天、九月 3030 天、十月 3131 天、十一月 3030 天、十二月 3131 天。其中,闰年的二月为 2929 天,平年为 2828 天。当年份是 400400 的倍数,或日期年份是 44 的倍数但不是 100100 的倍数时,该年为闰年。
  2. 公元 1582 年 10 月 5 日(含)至 10 月 14 日(含):不存在,这些日期被删除,该年 10 月 4 日之后为 10 月 15 日。
  3. 公元 1582 年 10 月 4 日(含)以前:适用儒略历,每月天数与格里高利历相同,但只要年份是 44 的倍数就是闰年。
  4. 尽管儒略历于公元前 45 年才开始实行,且初期经过若干次调整,但今天人类习惯于按照儒略历最终的规则反推一切 1582 年 10 月 4 日之前的时间。注意,公元零年并不存在,即公元前 1 年的下一年是公元 1 年。因此公元前 1 年、前 5 年、前 9 年、前 13 年……以此类推的年份应视为闰年。

2.输入格式

第一行一个整数 QQ,表示询问的组数。
接下来 QQ 行,每行一个非负整数 r_iri​,表示一个儒略日。

3.输出格式

对于每一个儒略日 r_iri​,输出一行表示日期的字符串 s_isi​。共计 QQ 行。 s_isi​ 的格式如下:

  1. 若年份为公元后,输出格式为 Day Month Year。其中日(Day)、月(Month)、年(Year)均不含前导零,中间用一个空格隔开。例如:公元 2020 年 11 月 7 日正午 12 点,输出为 7 11 2020
  2. 若年份为公元前,输出格式为 Day Month Year BC。其中年(Year)输出该年份的数值,其余与公元后相同。例如:公元前 841 年 2 月 1 日正午 12 点,输出为 1 2 841 BC

4.输入输出样例

输入#1                                                               输出#1

3                                      11 1 4713 BC
10 10 4 4713 BC
100 27 9 4711 BC
1000

输入#2                                                               输出#2

3                                      14 9 763
2000000                                15 8 3501
3000000                                12 7 6239
4000000

5.题意

计算公元前 4713年 1 月 1 日正午 12 点到此后某一时刻间所经过的天数。计算出该儒略日(一定是某一天的中午 12 点)所对应的公历日期。

6.思路

预处理出400年内的情况,将年份%400

7.代码实现

#include<bits/stdc++.h>
typedef long long ll;
const int N=146097;//格里高利历400年的天数
int BYD,A[N],B[N],C[N];
ll n,t;
inline int md(int y,int m)
{//格里高利历y年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;
}
int main()
{
B[0]=C[0]=1;
for(int i=1;i<N;++i)
{
C[i]=C[i-1]+1;B[i]=B[i-1];A[i]=A[i-1];
if(C[i]>md(A[i],B[i]))++B[i],C[i]=1;
if(B[i]>12)++A[i],B[i]=1;
}//A[i],B[i],C[i]表示从0年1月1日经过i天的年月日
scanf("%d",&BYD);
while(BYD--)
{
scanf("%lld",&n);
if(n>2299160)
{//格里高利历
n-=2159351;
t=n/N*400+1200;
n%=N;
}
else
{
t=n/1461*4-4712;//1461是儒略历4年的天数
n%=1461;
}
if(t+A[n]>0)printf("%d %d %lld\n",C[n],B[n],t+A[n]);
else printf("%d %d %lld BC\n",C[n],B[n],1-t-A[n]);
}
}


标签:10,12,洛谷,int,儒略,高利,3131,P7075
From: https://www.cnblogs.com/shi66/p/17725810.html

相关文章

  • 洛谷5249
    先给出一个我自己的不那么套路的做法设p[i][j]表示一共有i个人,第j个人最终幸存的概率那么有\(p[i][j]=\)\[p_{0}*p[i-1][j-1]+(1-p_{0})*p_{0}*p[i-1][j-2]+...+(1-p_{0})^{j-2}*p_{0}*p[i-1][1](即前面j-1个人是否死进行讨论)\]\[+\]\[\]......
  • 洛谷3750 分手是祝愿
    这种可能会有无穷的情况,就是对某一个开关一直按像这种题目我把他叫做无穷型嵌套期望这种题目一般都是用DP推出公式然后化简看着题首先,我们考虑假设最开始最少的操作少于k,应该怎么做很容易发现一个性质,就是按动一个开关,只能影响前面的开关,不能影响后面的开关这是什么?无后效性......
  • Solution of 洛谷-P1896
    并不会有更好的阅读体验\(\text{Sol}\)我们先看一眼数据范围:\(1\leN\le9\)没关系,DFS会出手。好吧,正经的说,如果暴搜的话复杂度会涨到\(\textO(2^{n^2})\),\(\textT\)到飞起。此时我们发现有个东西叫状压\(\text{DP}\),也是解决小范围数据的问题。老套路,枚举每一行,......
  • [洛谷]-5825排列计数-欧拉数、NTT
    目录边界对称性递推形式容斥https://www.luogu.com.cn/problem/P5825题意:我们记一个排列P的升高为\(k\)当且仅当存在\(k\)个位置\(i\)使得\(P_i<P_{i+1}\)。给定排列长度\(n\),对于所有整数\(k\in[0,n]\),求有多少个排列的升高为\(k\),\(1\leqn\leq2\times10^5\)......
  • 对期望线性性的理解以及例题:洛谷P3239
    \(E(X+Y)\)中\(X+Y\)到底什么意思?我们不妨设\(X\)对应事件1,他有一个样本空间\(\Omega_{1}\),这个样本空间中的每一个事件对应一个取值同理我们对\(Y\)也搞一个\(\Omega_{2}\)。那么\(X+Y\)指的就是\(X\)和\(Y\)的笛卡尔积两个集合的笛卡尔积指的是从这两个集合分别各取一个元素......
  • 洛谷P6583 回首过去
    涉及知识点:容斥原理、数论分块前言本题对于数论分块类型题目推式子和处理方法有很大的启发题面Link给定正整数\(n\),求有序实数对\((x,y)\)满足\(1\leqx,y\leqn\)并且使得\(\frac{x}{y}\)为有限小数(本题题意下整数可视作小数点后有\(0\)位的有限小数)。分析首先......
  • 洛谷P3612 [USACO17JAN] Secret Cow Code S
    [USACO17JAN]SecretCowCodeS题面翻译奶牛正在试验秘密代码,并设计了一种方法来创建一个无限长的字符串作为其代码的一部分使用。给定一个字符串,让后面的字符旋转一次(每一次正确的旋转,最后一个字符都会成为新的第一个字符)。也就是说,给定一个初始字符串,之后的每一步都会增加当......
  • 洛谷P2341 [USACO03FALL] 受欢迎的牛 G
    P2341受欢迎的牛G题解这题我们需要了解强连通分量一、定义在有向图\(G\)中,如果两个顶点\(u\),\(v\)间有一条从\(u\)到\(v\)的有向路径,同时还有一条从\(v\)到\(u\)的有向路径,则称两个顶点强连通。如果有向图\(G\)的每两个顶点都强连通,称\(G\)是一个强连通......
  • 洛谷3830
    对这题的第一问,我们可以感性地理解一下设f[i]表示i个叶子的平均叶子深度是多少那么增加一个叶子(即一次拓展操作)所有叶子的总深度增加了2,平均深度增加了\(\frac{2}{i}\)所以\(f[i]=f[i-1]+\frac{2}{i}\)然后就可以利用样例进行验证了如果不放心我们就老老实实地推式子给一些......
  • 洛谷P1058 [NOIP2008 普及组] 立体图
    写在前面题解更新较少,请勿嗔怪。本文粗鄙而简陋,要获得更好的阅读体验,请移步https://www.luogu.com.cn/problem/solution/P1058。NOIp普及组2008的第四题,题目网站https://www.luogu.com.cn/problem/P1058。关于题目[NOIP2008普及组]立体图题目描述小渊是个聪明的孩子,他经......