大佬们,帮帮我吧
查看原帖
大佬们,帮帮我吧
687911
chenyihao2011楼主2024/10/20 20:01

第一种(本来抱有很大期望,结果https://luogu.com.cn/record/183496384):

#include <bits/stdc++.h>
#define int long long
using namespace std;

int num1=366,num2=365*3+366,num3=(1580/4)*(365*3+366),num4=num2*100-3;
int q,r;
int month[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
int y=-4713,m=1,d=1;
void mon(int x){
	while(x!=0){
		while(x>=num2){
			y+=4;
			x-=num2;
			if(y>1583 and y%100==0 and y%400!=0) x++;
		}
		if(y>1583 and y%100==0 and y%400!=0 and x==num2-1) y+=4,x=0;
		
		while(x>=num1){
			if((y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) or (y<0 and abs(y)%4!=1) or (y>0 and y<=1582 and y%4!=0)) x-=365;
			else x-=366;
			y++;
		}
		if(x==365 and (y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) or (y<0 and abs(y)%4!=1) or (y>0 and y<=1582 and y%4!=0)) y++,x=0;
		if(m==2 and x>=28){
			bool f=0;
			if(y<0 and abs(y)%4!=1) m++,x-=28,f=1;
			else if(y>0 and y<=1582 and y%4!=0) m++,x-=28,f=1;
			else if(y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) m++,x-=28,f=1;
			if(f) continue;
		}
		while(x>=month[m]) printf("%d %d %d\n",d,m,y),x-=month[m],m++;
		d+=x;
		break;
	}
}
signed main(){
	cin>>q;
	while(q--){
		y=-4713,m=1,d=1;
		scanf("%d",&r);
		if(r>=num1){
			r-=num1;
			y+=1;
			if(r>=(4712/4)*num2){
				r-=(4712/4)*num2;
				y+=4713;
				if(r>=num3){
					r-=num3;
					y+=1580;
					if(r>=365){
						r-=365;
						y+=1;
						if(r>=355){
							y++;
							r-=355;
							if(r>=365*2){
								y+=2;
								r-=365*2;
								if(r>=num2*4){
									y+=16;
									r-=num2*4;
									if(r>=num4){
										int cnt=r/num4;
										y+=400*cnt;
										r-=num4*cnt;
										mon(r);
									}else mon(r);
								}
							}else mon(r);
						}else{
							mon(r);
							d+=10;
							if(d>=month[m]) d-=month[m],m++;
						}
					}else mon(r);
				}else mon(r);
			}else mon(r);
		}else{
			mon(r);
		}
		printf("%d %d %d ",d,m,abs(y));
		if(y<0) printf("BC");
		printf("\n");
	}
 	return 0;
}

第二种(不知为何re):

#include <bits/stdc++.h>
#define int long long
using namespace std;

int q,r;
int month[13]={0,31,32,31,30,31,30,31,31,30,31,30,31};
int y=-4713,m=1,d=1;
signed main(){
	cin>>q;
	while(q!=0){
		y=-4713,m=1,d=1;
		scanf("%d",&r);
		while(r!=0){
			while(r>=366){
				if(y==1582){
					y++,r-=355;
					continue;
				}
				if(y<0 and abs(y)%4==1) y++,r-=366;
				if(y>0 and y<1582 and y%4==0) y++,r-=366;
				if(y>=1583 and ((y%4==0 and y%100!=0) or y%400==0)) y++,r-=366;
				if(y<0 and abs(y)%4!=1) y++,r-=365;
				if(y>0 and y<=1582 and y%4!=0) y++,r-=365;
				if(y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) y++,r-=365;
				if(y==0) y++;
			}
			while(r>=31){
				if(m!=2){
					m++;
					r-=month[m-1];
				}else{
					if(y<0 and abs(y)%4==1) m++,r-=29;
					if(y>0 and y<=1582 and y%4==0) m++,r-=29;
					if(y>=1583 and ((y%4==0 and y%100!=0) or y%400==0)) m++,r-=29;
					if(y<0 and abs(y)%4!=1) m++,r-=28;
					if(y>0 and y<=1582 and y%4!=0) m++,r-=28;
					if(y>=1583 and (!(y%4==0 and y%100!=0) and !(y%400==0))) m++,r-=28;
				}
			}
			d++;
			r--;
//			r--;
//			d++;
//			if(y==1582 and m==10 and d>=5 and d<=14){
//				r++;
//				continue;
//			}
//			if(d>month[m]){
//				m++;
//				d=1;
//			}
		}
		printf("%d %d %d ",d,m,abs(y));
		if(y<0) printf("BC");
		printf("\n");
		q--;
	}
 	return 0;
}

2024/10/20 20:01
加载中...