WA40 蒟蒻求助 玄关
查看原帖
WA40 蒟蒻求助 玄关
936696
wrk091029楼主2024/3/24 22:02
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2310558+5;
ll q,r,now=0,mon[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
struct node{
	ll d,m,y;
}pw[N];
void check(int x){
	if(pw[x].y==1582&&pw[x].m==10&&pw[x].d==5) pw[x].d=15;
	if(pw[x].d>=mon[pw[x].m]+1){
		if(pw[x].m!=2){
			pw[x].d=1;
			pw[x].m=pw[x-1].m+1;
		}else{
			if((pw[x].y<0&&(pw[x].y+1)%4==0)||(pw[x].y>0&&pw[x].y%4==0)){
				if(pw[x].d==30){
					pw[x].d=1;
					pw[x].m=pw[x-1].m+1;
				}
			}else{
				pw[x].d=1;
				pw[x].m=pw[x-1].m+1;
			}
		}
	}
	if(pw[x].m==13){
		pw[x].m=1;
		pw[x].y=pw[x-1].y+1;
		if(pw[x].y==0) pw[x].y=1;
	}
}
void pre_work(){
	while(pw[now].y!=1600){
		now++;
		pw[now].d=pw[now-1].d+1;
		pw[now].m=pw[now-1].m;
		pw[now].y=pw[now-1].y;
		check(now);
	}
}
void wr(ll x){
	cout<<pw[x].d<<" "<<pw[x].m<<" "<<abs(pw[x].y);
	if(pw[x].y<0) cout<<" "<<"BC";
	cout<<"\n";
}
void solve(ll r){
	ll rid=r-now;
	ll d400=365*400+97;
	ll y400=rid/d400;
	rid-=y400*d400;
	ll d100=365*100+24;
	ll y100=rid/d100;
	rid-=y100*d100;
	ll d4=365*4+1;
	ll y4=rid/d4;
	rid-=d4*y4;
	ll d1=365;
	ll y1=rid/d1;
	rid-=y1*d1;
	ll y=1600+y400*400+y100*100+y4*4+y1*1;
	ll m=1;
	while(rid-mon[m]>0){
		if((y%400==0||(y%4==0&&y%100!=0))&&m==2) rid-=1; 
		rid-=mon[m];
		m++;
		if(m==13) m=1,y++;
	}
	if(m!=1){
		if(rid-mon[m-1]==0) rid=1;
	}else{
		if(rid-mon[12]==0) rid=1;
	}
	cout<<rid<<" "<<m<<" "<<y<<"\n";
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	pw[0].d=1;
	pw[0].m=1;
	pw[0].y=-4713;
	pre_work();
	cin>>q;
	while(q--){
		cin>>r;
		if(r<=now) wr(r);
		else solve(r);
	}
	return 0;
}

大模拟写废了
思路:先暴力求1600年以前的,以后的再手动计算。严重怀疑后半部分出错。
感谢各位大侠鼎力相助!!!

2024/3/24 22:02
加载中...