CSP-S T1,自测都是 100pts,查分查出来 0 分。
代码:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
inline int read()
{
char ch=getchar();
int flag=1;
while(ch<'0'||ch>'9')
{
ch=getchar();
if(ch=='-')
flag=-1;
}
int res=0;
while(ch>='0'&&ch<='9')
{
res=res*10+ch-'0';
ch=getchar();
}
return res*flag;
}
const int fy=366+365+365+365;
const int fhy=146097;
int mt[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int q;
ll r;
int main()
{
freopen("julian.in","r",stdin);
freopen("julian.out","w",stdout);
q=read();
while(q--)
{
scanf("%lld",&r);
++r;
if(r<=1721424)
{
int y=r/fy*4;
r%=fy;
if(r>=366)
{
++y;
r-=366;
while(r>=365)
{
++y;
r-=365;
}
}
y=4713-y;
if(y%4==1)
++mt[2];
int m=1;
while(r>=mt[m])
{
r-=mt[m];
++m;
}
if(r==0&&m==1)
{
++y;
m=12;
r=31;
}
else if(r==0)
{
--m;
r=mt[m];
}
printf("%d %d %d BC\n",r,m,y);
mt[2]=28;
}
else
{
r-=1721424;
if(r<=577737)
{
int y=r/fy*4;
r%=fy;
if(r>=365)
{
++y;
r-=365;
if(r>=365)
{
++y;
r-=365;
if(r>=365)
{
++y;
r-=365;
}
}
}
y=y+1;
if(y%4==0)
mt[2]=29;
int m=1;
while(r>=mt[m])
{
r-=mt[m];
++m;
}
if(r==0&&m==1)
{
--y;
m=12;
r=31;
}
else if(r==0)
{
--m;
r=mt[m];
}
printf("%d %d %d\n",r,m,y);
mt[2]=28;
}
else
{
r-=577737;
if(r<=78)
{
if(r<=17)
printf("%d %d %d\n",14+r,10,1582);
else
{
if(r==78)
{
printf("%d %d %d\n",31,12,1582);
continue;
}
r-=17;
int m=11;
while(r>=mt[m])
{
r-=mt[m];
++m;
}
if(r==0)
{
--m;
r=mt[m];
}
printf("%d %d %d\n",r,m,1582);
}
}
else
{
r-=78;
int y=1582+r/fhy*400+1;
r%=fhy;
for(int i=1583;i<1983;++i)
{
int dd;
if((i%400==0)||(i%4==0&&i%100!=0))
dd=366;
else
dd=365;
if(r>=dd)
{
r-=dd;
++y;
}
else
break;
}
if((y%400==0)||(y%4==0&&(y%100!=0)))
mt[2]=29;
int m=1;
while(r>=mt[m])
{
r-=mt[m];
++m;
}
if(r==0&&m==1)
{
r=31;
m=12;
--y;
}
else if(r==0)
{
--m;
r=mt[m];
}
printf("%d %d %d\n",r,m,y);
mt[2]=28;
}
}
}
}
fclose(stdin);
fclose(stdout);
return 0;
}