求助
查看原帖
求助
287395
abc_de楼主2022/6/12 14:07

真的调不出来了40pts 前面的四个点没问题 后面的就是调不出来

#include<bits/stdc++.h>
using namespace std;
long long q,r;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
long long rd(){
	long long x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){	
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();	
	}
	return x*f;
}
int main(){
	q=rd();
	while(q--){
		r=rd();
		month[2]=28;
		if(r<=1721423){
			int l1=1,r1=4713,day;
			while(l1<r1){
				int mid=(l1+r1)>>1;
				day=(4713-mid)*365+(4713-mid+3)/4;
				if(r>=day) r1=mid;
				else l1=mid+1;	
			}
			r-=(4713-l1)*365+(4713-l1+3)/4;
			if((l1-1)%4==0) month[2]++;
			int p=1;
			while(r>0){
				if(r-month[p]<0) break;
				r-=month[p];
				p++;
			}
			cout<<1+r<<" "<<p<<" "<<l1<<" "<<"BC"<<endl;
		}
		else{
			r-=1721423;
			long long l1=1,r1=1e9+1,day;
			while(l1<r1){
				long long mid=(l1+r1)>>1;
				if(mid<=1582) day=(mid-1)*365+(mid-1)/4;
				else day=577815+(mid-1583)*365+(mid-1585+4)/4-(mid-1601+100)/100+(mid-1601+400)/400;
				if(mid<=1582)
					if(mid%4==0) day++;
				else if(mid%400==0||(mid%4==0&&mid%100!=0)) day++;
				day+=365;
				if(r>day) l1=mid+1;
				else r1=mid;
			}
			if(l1<=1582) r-=(l1-1)*365+(l1-1)/4;
			else r-=(577815+(l1-1583)*365+(l1-1585+4)/4-(l1-1601+100)/100+(l1-1601+400)/400);
			if(l1<=1582)
				if(l1%4==0) month[2]++;
			else if(l1%400==0||(l1%4==0&&l1%100!=0)) month[2]++;
			int p=1;
			while(r>0){
				if(r-month[p]<0) break;
				r-=month[p];
				p++;
			}
			if(l1==1582){
				if(r>=5) r=r-5+14;
				if(r>31) p++,r%=31;
			}
			cout<<r<<" "<<p<<" "<<l1<<endl;
		}
	}
	return 0;	
}
2022/6/12 14:07
加载中...