這是一道超級大模擬
前后調了差不多3個小時,要是考場上那就已經炸了
題意其實很簡單,但是處理起來是真的麻煩
最后寫了份特別丑的代碼,A過去了
主要是特例判的惡心,總是會有1月0日的錯誤
這題一定要耐住性子做下來試試
#include <bits/stdc++.h>
using namespace std;
const long long day = 365;
const long long bound = 2299161;
const long long bound2 = 1721424;
vector<long long> month(13);
vector<long long> month2(13);
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
month2[1] = 31;
month2[2] = month2[1] + 29;
month2[3] = month2[2] + 31;
month2[4] = month2[3] + 30;
month2[5] = month2[4] + 31;
month2[6] = month2[5] + 30;
month2[7] = month2[6] + 31;
month2[8] = month2[7] + 31;
month2[9] = month2[8] + 30;
month2[10] = month2[9] + 31;
month2[11] = month2[10] + 30;
month2[12] = month2[11] + 31;
month[1] = 31;
month[2] = month[1] + 28;
month[3] = month[2] + 31;
month[4] = month[3] + 30;
month[5] = month[4] + 31;
month[6] = month[5] + 30;
month[7] = month[6] + 31;
month[8] = month[7] + 31;
month[9] = month[8] + 30;
month[10] = month[9] + 31;
month[11] = month[10] + 30;
month[12] = month[11] + 31;
long long BY = 3 * day + day + 1;
long long Q;
cin>>Q;
long long r;
while(Q--) {
cin>>r;
r += 1;
if(r <= bound) {
if(r <= bound2) {
long long y = (r / BY) * 4;
r %= BY;
if(r == 0) {
y--;
r += 366;
}
if(r <= 366) {
long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
long long d = r - month2[x - 1];
cout<<d<<" "<<x<<" "<<4713 - y<<" "<<"BC"<<"\n";
}else {
r -= 366;
y += 1;
y += r / 365;
r %= 365;
if(r == 0) {
y--;
r += 365;
}
long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
long long d = r - month[x - 1];
cout<<d<<" "<<x<<" "<<4713 - y<<" "<<"BC"<<"\n";
}
}
else {
r -= bound2;
int flag = 1;
if(r == 0) flag = 0;
long long y = (r / BY) * 4;
r %= BY;
if(r == 0 && flag == 1) {
y--;
r += 366;
cout<<31<<" "<<12<<" "<<1 + y<<"\n";
}else {
y += r / 365;
if(r / 365 == 3) {
r %= 365;
if(r == 0) {
y--;
cout<<31<<" "<<12<<" "<<1 + y<<"\n";
}
else {
long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
long long d = r - month2[x - 1];
cout<<d<<" "<<x<<" "<<1 + y<<"\n";
}
}
else if(r / 365 == 4) {
y--;
r = 365;
long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
long long d = r - month2[x - 1];
cout<<d<<" "<<x<<" "<<1 + y<<"\n";
}
else {
r %= 365;
if(r == 0 && flag) {
y--;
cout<<31<<" "<<12<<" "<<1 + y<<"\n";
}
else {
long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
long long d = r - month[x - 1];
cout<<d<<" "<<x<<" "<<1 + y<<"\n";
}
}
}
}
}
else {
r -= bound;
if(r <= 78) {
r += month[9] + 4;
r += 10;
long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
long long d = r - month[x - 1];
cout<<d<<" "<<x<<" "<<1582<<"\n";
}else {
r -= 78;
long long year = 1583;
if(r <= 6575) {
if(r <= 365) {
long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
long long d = r - month[x - 1];
cout<<d<<" "<<x<<" "<<1583<<"\n";
}
else {
r -= 365;
long long y = (r / BY) * 4;
r %= BY;
if(r == 0) {
y--;
r += 366;
}
if(r <= 366) {
long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
long long d = r - month2[x - 1];
cout<<d<<" "<<x<<" "<<y + 1584<<"\n";
}
else {
r -= 366;
y += 1;
y += r / 365;
r %= 365;
if(r == 0) {
y--;
r += 365;
}
long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
long long d = r - month[x - 1];
cout<<d<<" "<<x<<" "<<1584 + y<<"\n";
}
}
}
else {
r -= 6575;
long long YY = BY * 100 - 3;
long long y = (r / YY) * 400;
r %= YY;
if(r == 0) {
y--;
r += 366;
}
else {
long long YYY = BY * 25 - 1;
y += (r / YYY) * 100;
r %= YYY;
if(r == 0) {
y--;
r += 365;
}else {
y += (r / BY) * 4;
r %= BY;
if(r == 0) {
y--;
r += 366;
}
else {
y += r / 365;
if(r / 365 == 4) {
y--;
r -= 365 * 3;
}
else {
r %= 365;
if(r == 0) {
y--;
r += 365;
}
}
}
}
}
if((1601 + y) % 4 == 0 && (1601 + y) % 100 != 0) {
long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
long long d = r - month2[x - 1];
cout<<d<<" "<<x<<" "<<y + 1601<<"\n";
}
else if((1601 + y) % 400 == 0) {
long long x = lower_bound(month2.begin() + 1, month2.end(), r) - month2.begin();
long long d = r - month2[x - 1];
cout<<d<<" "<<x<<" "<<y + 1601<<"\n";
}
else {
long long x = lower_bound(month.begin() + 1, month.end(), r) - month.begin();
long long d = r - month[x - 1];
cout<<d<<" "<<x<<" "<<y + 1601<<"\n";
}
}
}
}
}
return 0;
}