Description
Input
Output
Sample Input
Sample Input1 3 10 100 1000 Sample Input2 3 2000000 3000000 4000000
Sample Output
Sample Output1 11 1 4713 BC 10 4 4713 BC 27 9 4711 BC Sample Output2 14 9 763 15 8 3501 12 7 6239
Data Constraint
Solution
先把时间分成公元前、公元后1582.10.4前、公元后1582.10.15后,暴力算出每段的范围,分类讨论
前两种做法类似,先按照4年为周期算,剩下的零散部分暴力求
后一种先按400年为周期算,剩下的也暴力,时间复杂度O(400n)、
总结:思路很简单、很暴力,
但是细节很多。
千万不能相信它“精心”给你出的小大样例!
必须肉查一遍、对每一段都出数据验证!
要相信:
你都已经做了两个小时了,
再检查半个小时也没什么大问题。
以下几种代码,看看你需要看哪种,能看得懂哪种吧
Code1
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define I int
#define ll long long
#define F(i,a,b) for(I i=a;i<=b;i++)
#define Fd(i,a,b) for(I i=a;i>=b;i--)
#define mem(a,b) memset(a,b,sizeof a)
using namespace std;
ll T,r,d,m,y;
I bc,a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
I main(){
freopen("julian.in","r",stdin);
freopen("julian.out","w",stdout);
scanf("%lld",&T);
I tot=0;
while(T--){
if(++tot==21){
tot++,tot--;
}
scanf("%lld",&r);
bc=(r<1721424);y=4713,m=1,d=1;
if(r<1721424){
y-=(r/1461)*4;
r%=1461;
while(r>=365+(y%4==1)){
r-=365+(y%4==1);y--;
}
if(!y) y=1;
while(r){
if(m!=2&&r>=a[m]){
r-=a[m];m++;
}
else if(m==2&&r>=a[m]+(y%4==1)){
r-=a[m]+(y%4==1);m++;
}
else{
d+=r;r=0;break;
}
}
}
else{
r-=1721424;
if(r<=577736){
y=m=d=1;
y+=(r/1461)*4;
r%=1461;
while(r>=365+(y%4==0)){
r-=365+(y%4==0);y++;
}
while(r){
if(m!=2&&r>=a[m]){
r-=a[m];m++;
}
else if(m==2&&r>=a[m]+(y%4==0)){
r-=a[m]+(y%4==0);m++;
}
else{
d+=r;r=0;break;
}
}
}
else{
y=1582,m=10,d=15;
r-=577737;
if(r<78){
if(r<=16){
d+=r;
}
else{
r-=17;
m=11,d=1;
while(r){
if(m!=2&&r>=a[m]){
r-=a[m];m++;
}
else if(m==2&&r>=a[m]+(((y%4==0)&&(y%100>0))||(y%400==0))){
r-=a[m]+(((y%4==0)&&(y%100>0))||(y%400==0));m++;
}
else{
d+=r;r=0;break;
}
if(m>12) m=1;
}
}
}
else{
r-=78;
y=1583,m=d=1;
y+=(r/584388)*1600;
r%=584388;
while(r>=365+((((y)%4==0)&&((y)%100>0))||((y)%400==0))){
r-=365+((((y)%4==0)&&((y)%100>0))||((y)%400==0));
y++;
}
while(r){
if(m!=2&&r>=a[m]){
r-=a[m];m++;
}
else if(m==2&&r>=a[m]+(((y%4==0)&&(y%100>0))||(y%400==0))){
r-=a[m]+(((y%4==0)&&(y%100>0))||(y%400==0));m++;
}
else{
d+=r;r=0;break;
}
}
}
}
}
if(!bc) printf("%lld %lld %lld\n",d,m,y);
else printf("%lld %lld %lld BC\n",d,m,y);
}
return 0;
}
Code2
#include<cstdio>
using namespace std;
typedef long long ll;
const int _400y=146097,_4y=1461,mid=2299160,BC=1721424;
const int day[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int D[146105],M[146105],Y[146105];
int main()
{
freopen("julian.in","r",stdin);
freopen("julian.out","w",stdout);
int q;ll n,d,m,y;bool flag=1;
scanf("%d",&q);
for(int cnt=0,da=1,mo=1,ye=0;cnt<=_400y;++cnt,++da)
{
if(da>da