考试的时候T1写了2.5h,最后没调出来放弃的时候真的快哭了
以下考试代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <algorithm>
typedef long long ll;
const int maxn=100000+10,d_4=1461,d_400=146097;
ll read(){
ll w=0,x=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') x=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
w=(w<<1)+(w<<3)+(ch^48);
ch=getchar();
}
return w*x;
}
int q;
ll x;
ll Day,Month,Year;
void Solve1(){//公元前,julian历
ll xx=x/d_4;
Year=4713-xx*4;
x=x%d_4;
Day=1;
Month=1;
if(x>366){
x-=366;
Year--;
}
if(x>365){
x-=365;
Year--;
}
if(x>365){
x-=365;
Year--;
}
if(x<31){//1
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if((Year-1)%4==0){//2
if(x<29){
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=29;
}else {
if(x<28){
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=28;
}
Month++;
if(x<31){//3
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//4
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//5
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//6
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//7
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<31){//8
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//9
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//10
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//11
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//12
Day+=x;
printf("%lld %lld %lld BC\n",Day,Month,Year);
return;
}
x-=31;
Month++;
}
void Solve2(){//公元,julian历
ll xx=x/d_4;
Year=xx*4+1;
x=x%d_4;
Day=1;
Month=1;
if(x>365){
x-=365;
Year++;
}
if(x>365){
x-=365;
Year++;
}
if(x>365){
x-=365;
Year++;
}
if(x<31){//1
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(Year%4==0){//2
if(x<29){
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=29;
}else {
if(x<28){
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=28;
}
Month++;
if(x<31){//3
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//4
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//5
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//6
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//7
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<31){//8
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//9
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//10
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//11
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//12
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
}
bool is_r(ll x){
if(x%400==0) return true;
if(x%4==0&&x%100!=0) return true;
return false;
}
void Solve3(){//公元,格里高利历
if(x<77){
Year=1582;
Month=10;
Day=15;
if(x<17){//10
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=17;
Month++;
Day=1;
if(x<=30){//11
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//12
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
}
x-=77;
Year=1583;
Month=1;
Day=1;
ll xx=x/d_400;
Year+=xx*400;
x%=d_400;
xx=x/d_4;
Year+=xx*4;
x%=d_4;
//printf("x==%lld\n",x);
while(x>=365){
if(is_r(Year)){
if(x<366) break;
Year++;
x-=366;
}
else {
Year++;
x-=365;
}
}
if(x<31){//1
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(is_r(Year)){//2
if(x<29){
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=29;
}else {
if(x<28){
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=28;
}
Month++;
if(x<31){//3
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//4
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//5
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//6
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//7
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<31){//8
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//9
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//10
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
if(x<30){//11
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=30;
Month++;
if(x<31){//12
Day+=x;
printf("%lld %lld %lld\n",Day,Month,Year);
return;
}
x-=31;
Month++;
}
void Solve(){
q=read();
while(q--){
Day=0;
Month=0;
Year=0;
x=read();
if(x<1721424){
Solve1();
continue;
}
x-=1721424;
if(x<577736){
Solve2();
continue;
}
else {
x-=577736;
Solve3();
}
}
}
int main(){
freopen("julian.in","r",stdin);
freopen("julian.out","w",stdout);
Solve();
return 0;
}