大模拟bug
  • 板块题目总版
  • 楼主wlxs2006
  • 当前回复3
  • 已保存回复3
  • 发布时间2021/5/29 19:07
  • 上次更新2023/11/4 22:33:08
查看原帖
大模拟bug
242405
wlxs2006楼主2021/5/29 19:07

7075,RT

#include<iostream>
#include<cmath>
using namespace std;
#define int long long
const int N=6500000;
const int M=146500;
const int M2=146097;
int n,y[N+10],m[N+10],d[N+10],y2[M],m2[M],d2[M];
int dy[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int k){
	if(k<0){
		if((k+100005)%4==0) return true;
		else return false;
	}
	else{
		if(k<1582){
			if(k%4==0) return true;
			else return false;
		}
		if((k%4==0&&k%100!=0)||k%400==0) return true;
		else return false;
	}
}
bool check2(int k){
	if(k%4==0&&k%100!=0) return true;
	if(k%100==0&&k%400!=0) return false;
	if(k%400==0) return true;
	return false;
}
signed main(){
	int x,tmp,yy=-4713,mm=1,dd=1;
	cin>>n;
	for(int i=1;i<=N;++i){
		dy[2]=28;
		if(check(yy)) dy[2]++;
		if(yy==1582&&mm==10&&dd==4){
			dd=15;
			y[i]=yy;
			m[i]=mm;
			d[i]=dd;
			continue;
		}
		if(dd==dy[mm]){
			if(mm==12){
				if(yy==-1) yy=1;
				else ++yy;
				mm=dd=1;
			}
			else{
				++mm;
				dd=1;
			}
		}
		else{
			++dd;
		}
		y[i]=yy;
		m[i]=mm;
		d[i]=dd;
	}
	yy=1;
	mm=1;
	dd=1;
	for(int i=1;i<=146400;++i){
		dy[2]=28;
		if(check2(yy)) dy[2]++;
		if(dd==dy[mm]){
			if(mm==12){
				if(yy==-1) yy=1;
				else ++yy;
				mm=dd=1;
			}
			else{
				++mm;
				dd=1;
			}
		}
		else{
			++dd;
		}
		y2[i]=yy;
		m2[i]=mm;
		d2[i]=dd;
	}
	while(n--){
		cin>>x;
        if(x==0){
            cout<<"1 1 4713 BC"<<endl;
            continue;
        }
		if(x<=N){
			cout<<d[x]<<" "<<m[x]<<" "<<abs(y[x]);
			if(y[x]<0) cout<<" BC";
			cout<<endl;
		}
		else{
			x-=2451911;
			tmp=y2[x%M2]+(x/M2)*400+2000;
			cout<<d2[x%M2]<<" "<<m2[x%M2]<<" "<<tmp<<endl;
		}
	}
return 0;
}

主要思路:公元后2000年前,特判处理; 公元后2000年后,以400年为一周期打表。

结果90分,WA了最后一个点。。求助

2021/5/29 19:07
加载中...