P7075 [CSP-S2020] 儒略日

2023-09-20 17:41:05

题目

题目描述

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

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

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

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

输入格式

第一行一个整数 Q Q Q,表示询问的组数。
接下来 Q Q Q 行,每行一个非负整数 r i r_i ri,表示一个儒略日。

输出格式

对于每一个儒略日 r i r_i ri,输出一行表示日期的字符串 s i s_i si。共计 Q Q Q 行。 s i s_i si 的格式如下:

  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

样例 #1

样例输入 #1

3
10
100
1000

样例输出 #1

11 1 4713 BC
10 4 4713 BC
27 9 4711 BC

样例 #2

样例输入 #2

3
2000000
3000000
4000000

样例输出 #2

14 9 763
15 8 3501
12 7 6239

样例 #3

样例输入 #3

见附件中的 julian/julian3.in

样例输出 #3

见附件中的 julian/julian3.ans

提示

【数据范围】

测试点编号 Q = Q = Q= r i ≤ r_i \le ri
1 1 1 1000 1000 1000 365 365 365
2 2 2 1000 1000 1000 1 0 4 10^4 104
3 3 3 1000 1000 1000 1 0 5 10^5 105
4 4 4 10000 10000 10000 3 × 1 0 5 3\times 10^5 3×105
5 5 5 10000 10000 10000 2.5 × 1 0 6 2.5\times 10^6 2.5×106
6 6 6 1 0 5 10^5 105 2.5 × 1 0 6 2.5\times 10^6 2.5×106
7 7 7 1 0 5 10^5 105 5 × 1 0 6 5\times 10^6 5×106
8 8 8 1 0 5 10^5 105 1 0 7 10^7 107
9 9 9 1 0 5 10^5 105 1 0 9 10^9 109
10 10 10 1 0 5 10^5 105年份答案不超过 1 0 9 10^9 109

分析

特别友善的毒瘤题,3小时没调出来
可以用O(1)做的
不难发现,1200后400年可以作为一个周期,算出格里高利历4年的天数( 365 ∗ 3 + 366 = 1461 365*3+366=1461 3653+366=1461),就可以算出其400年的天数( 146097 146097 146097)
从4713年到1582年的儒略历的天数也可以算出来( 2299160 2299160 2299160),只需要判断r的大小便可判断出是格里高利历还是儒略历
为了方便,我们设自1200年1月1日起格里高利历开始,并减去跳过的天数( 2159351 2159351 2159351)
那么2159351怎么算?
首先算出 1461 ∗ 300 ( 公元后 1.1.1 到 1200.1.1 的天数 ) + 4712 / 4 ∗ 1461 ( 公元前 4713.1.1 到 1.1.1 的天数 ) = 2159358 1461*300(公元后1.1.1到1200.1.1的天数)+4712/4*1461(公元前4713.1.1到1.1.1的天数)=2159358 1461300(公元后1.1.11200.1.1的天数)+4712/41461(公元前4713.1.11.1.1的天数)=2159358
我们减去2159358以此算出格里高利历的日期(应该再减去10天),但是,
因为我们认为格里高利历从1200年开始,因此认为1300,1400,1500年不是闰年,所以多减了3天
也就是2159358-10+3

AC代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=146097;
int y[N],m[N],d[N];
int n,t;
int md(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;
}
signed main()
{
	m[0]=d[0]=1;
	for(int i=1;i<N;i++){//400年的周期中第几天在几月几日
		d[i]=d[i-1]+1,m[i]=m[i-1],y[i]=y[i-1];
		if(d[i]>md(y[i],m[i])) ++m[i],d[i]=1;
		if(m[i]>12) ++y[i],m[i]=1;
	}
	int T;
	cin>>T;
	while(T--){
		cin>>n;
		if(n>2299160){
			n-=2159351;
			t=n/N*400+1200;
			n%=N;
		}
		else{
			t=n/1461*4-4712;
			n%=1461;
		}
		if(t+y[n]>0) cout<<d[n]<<" "<<m[n]<<" "<<t+y[n]<<endl;
		else cout<<d[n]<<" "<<m[n]<<" "<<1-t-y[n]<<" BC"<<endl;
	}
}
更多推荐

线性代数的本质(十)——矩阵分解

文章目录矩阵分解LU分解QR分解特征值分解奇异值分解奇异值分解矩阵的基本子空间奇异值分解的性质矩阵的外积展开式矩阵分解矩阵的因式分解是把矩阵表示为多个矩阵的乘积,这种结构更便于理解和计算。LU分解设AAA是m×nm\timesnm×n矩阵,若AAA可以写成乘积A=LUA=LUA=LU其中,LLL为mmm阶下三角方阵,主

CodeArts Check代码检查服务用户声音反馈集锦(4)

作者:gentle_zhou原文链接:CodeArtsCheck代码检查服务用户声音反馈集锦(4)-云社区-华为云CodeArtsCheck(原CodeCheck),是自主研发的代码检查服务。建立在华为30年自动化源代码静态检查技术积累与企业级应用经验的沉淀之上,为用户提供代码风格、通用质量与网络安全风险等丰富的检查能

【智慧工地源码】智慧工地助力数字建造、智慧建造、安全建造、绿色建造

智慧工地围绕建设过程管理,建设项目与智能生产、科学管理建设项目信息生态系统集成在一起,该数据在虚拟现实环境中,将物联网收集的工程信息用于数据挖掘和分析,提供过程趋势预测和专家计划,实现工程建设的智能化管理,提高工程管理信息水平,逐步实现绿色建设和生态建设。一、施工现场智能化管理物联网智慧工地通过手机/PAD自动感应或采

Python爬虫

一、保存数据到Excelfrombs4importBeautifulSoup#网页解析,获取数据importre#正则表达式,进行文字匹配importurllib.request,urllib.error#制定URL,获取网页数据importxlwt#进行excel操作importsqlite3#进行SQLite数据库

【案例+源码】数据可视化之统计绘图-Seaborn全套教程

数据可视化-Seaborn简易入门Matplotlib试着让简单的事情更加简单,困难的事情变得可能,而Seaborn就是让困难的东西更加简单。seaborn是针对统计绘图的,一般来说,seaborn能满足数据分析90%的绘图需求。Seaborn其实是在matplotlib的基础上进行了更高级的API封装,从而使得作图更

前端JavaScript中requestAnimationFrame:优化动画和渲染的利器

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录引言1.requestAnimationFrame简介2.requestAnimationFrame的属性3.requestAnimationFrame的应用场景3.1动画效果3.2游戏开发3.3数据可视化3.

SpringBoot结合Vue.js+axios框架实现增删改查功能+网页端实时显示数据库数据(包括删除多条数据)

本文适用对象:已有基础的同学,知道基础的SpringBoot配置和Vue操作。在此基础上本文实现基于SpringBoot和Vue.js基础上的增删改查和数据回显、刷新等。一、实时显示数据库数据实现步骤:第1步:编写动态请求响应类:在启动类同父目录下创建controller包,在包下创建DataController类,添

Compose的一些小Tips - 可组合项的绘制

系列文章Compose的一些小Tips-可组合项的生命周期Compose的一些小Tips-可组合项的绘制(本文)Compose的一些小Tips-列表的优化前言本系列介绍Compose的一些常识,了解这些tips并不会让人摇身一变成为大佬,但可以帮助到一些学习Compose的安卓开发者避免一些误区,也是对Compose入

惯性动捕+数据手套,让“虚拟”触手可及

当今,虚拟现实技术已经从科幻电影走进现实生活。在数字化时代,惯性动作捕捉系统与数据手套的结合使用,带给我们全新的虚拟互动体验,使虚拟世界更能够“触手可及”。01惯性动作捕捉系统FOHEARTMAGIC是一款高性能的惯性动作捕捉系统。它由17个惯性传感器和数据接收器组成。每个惯性传感器都内置了三轴加速度计、三轴磁力计和三

【看表情包学Linux】软硬链接 | 软连接数 | 创建软硬链接 | 动静态库 | 生成静态库 | 生成动态库

🤣爆笑教程👉《看表情包学Linux》👈猛戳订阅🔥💭写在前面:上一章我们讲解了inode,为文件系统收了尾,这几章我们充分地讲解完了文件系统的知识点,现在我们开始开始学习软硬链接了。如果没有文件系统的铺垫,想直接理解软硬链接难免有些困难。但我们讲完了文件系统再去理解软硬链接,你就会发现没有那么难,因为我们是从底

MyBatis 高级使用

文章目录动态SQL语句ifchoosetrimforeach批量操作批量插入批量更新批量删除BatchExecutor关联查询嵌套查询延迟加载分页操作逻辑分页物理分页MyBatisGenerator添加配置文件添加插件生成通用Mapper方式一方式二MyBatis-Plus动态SQL语句动态SQL是MyBatis的强大

热文推荐