help P7075 40
  • 板块题目总版
  • 楼主ZXXS
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/11/19 17:37
  • 上次更新2023/10/27 02:21:01
查看原帖
help P7075 40
595999
ZXXS楼主2022/11/19 17:37
#include<bits/stdc++.h>
#define debug(x) cerr<<#x<<"="<<(x)<<endl;
using namespace std;
long long Q,r,BCyear[4715],yue1[15]={0,31,31+28,31+28+31,31+28+31+30,31+28+31+30+31,31+28+31+30+31+30,31+28+31+30+31+30+31,31+28+31+30+31+30+31+31,31+28+31+30+31+30+31+31+30,31+28+31+30+31+30+31+31+30+31,31+28+31+30+31+30+31+31+30+31+30,31+28+31+30+31+30+31+31+30+31+30+31},yue2[15]={0,31,31+29,31+29+31,31+29+31+30,31+29+31+30+31,31+29+31+30+31+30,31+29+31+30+31+30+31,31+29+31+30+31+30+31+31,31+29+31+30+31+30+31+31+30,31+29+31+30+31+30+31+31+30+31,31+29+31+30+31+30+31+31+30+31+30,31+29+31+30+31+30+31+31+30+31+30+31};
long long AD15821004qian[1588];
long long AD400[405];
bool panduan(long long x)
{
	if(x%400==0)
	{
		return true;
	}
	else if(x%100==0)
	{
		return false;
	}
	else if(x%4==0)
	{
		return true;
	}
	return false;
}
int main()
{
	scanf("%lld",&Q);
	BCyear[4713]=366;//12.31天数 
	for(int i=4712;i>=1;--i)
	{
		if((i-1)%4==0)
		{
			BCyear[i]=BCyear[i+1]+366;
		}
		else
		{
			BCyear[i]=BCyear[i+1]+365;
		}
	}
	AD15821004qian[1]=365;
	for(int i=1;i<=1582;++i)
	{
		if(i%4==0)
		{
			AD15821004qian[i]=AD15821004qian[i-1]+366;
		}
		else
		{
			AD15821004qian[i]=AD15821004qian[i-1]+365;
		}
	}
	for(int i=1;i<=400;++i)
	{
		if(i%100==0)
		{
			if(i%400==0)
			{
				AD400[i]=AD400[i-1]+366;
			}
			else
				AD400[i]=AD400[i-1]+365;
		}
		else if(i%4==0)
		{
			AD400[i]=AD400[i-1]+366;
		}
		else
		{
			AD400[i]=AD400[i-1]+365;
		}
	}
	while(Q--)
	{
		scanf("%lld",&r);
		if(r<1721424)//BC 4713——BC 1天数 
		{
			++r;
			int L=1,R=4713,ansyear;
			while(L<=R)
			{
				int mid=(L+R)/2;
				if(BCyear[mid]>=r)
				{
					ansyear=mid;
					L=mid+1;
				}
				else
				{
					R=mid-1;
				}
			}
			r-=BCyear[ansyear+1];
			if((ansyear-1)%4==0)
			{
				int L=1,R=12,ansyue;
				while(L<=R)
				{
					int mid=(L+R)/2;
					if(yue2[mid]>=r)
					{
						ansyue=mid;
						R=mid-1;
					}
					else
					{
						L=mid+1;
					}
				}
				r-=yue2[ansyue-1];
				printf("%lld %lld %lld BC\n",r,ansyue,ansyear);
			}
			else
			{
				int L=1,R=12,ansyue;
				while(L<=R)
				{
					int mid=(L+R)/2;
					if(yue1[mid]>=r)
					{
						ansyue=mid;
						R=mid-1;
					}
					else
					{
						L=mid+1;
					}
				}
				r-=yue1[ansyue-1];
				printf("%lld %lld %lld BC\n",r,ansyue,ansyear);
			}
			continue;
		}
		r-=1721423;
		if(r<=577737)
		{
			int L=1,R=1582,ansyear;
			while(L<=R)
			{
				int mid=(L+R)/2;
				if(AD15821004qian[mid]>=r)
				{
					ansyear=mid;
					R=mid-1;
				}
				else
				{
					L=mid+1;
				}
			}
			r-=AD15821004qian[ansyear-1];
			if((ansyear)%4==0)
			{
				int L=1,R=12,ansyue;
				while(L<=R)
				{
					int mid=(L+R)/2;
					if(yue2[mid]>=r)
					{
						ansyue=mid;
						R=mid-1;
					}
					else
					{
						L=mid+1;
					}
				}
				r-=yue2[ansyue-1];
				printf("%lld %lld %lld \n",r,ansyue,ansyear);
			}
			else
			{
				int L=1,R=12,ansyue;
				while(L<=R)
				{
					int mid=(L+R)/2;
					if(yue1[mid]>=r)
					{
						ansyue=mid;
						R=mid-1;
					}
					else
					{
						L=mid+1;
					}
				}
				r-=yue1[ansyue-1];
				printf("%lld %lld %lld \n",r,ansyue,ansyear);
			}
			continue;
		}
		r-=577737;
		if(r<=78)
		{
			int nian=1582,yue=10,ri=14;
			for(int i=1;i<=r;++i)
			{
				++ri;
				if(yue==10&&ri>31)
				{
					++yue,ri=1;
				}
				else if(yue==11&&ri>30)
				{
					++yue,ri=1;
				}
				if(yue==12&&ri>31)
				{
					++nian,yue=1,ri=1;
				}
			}
			printf("%lld %lld %lld \n",ri,yue,nian);
			continue;
		}
		r-=78;
     ////////从这里开始出错
		long long Q=r/146097;
		r=r%146097;
		int L=1,R=400,ansyear;
		while(L<=R)
		{
			int mid=(L+R)/2;
			if(AD400[mid]>=r)
			{
				ansyear=mid;
				R=mid-1;
			}
			else
			{
				L=mid+1;
			}
		}
		r-=AD400[ansyear-1];
		if(panduan(1582+ansyear+400*Q))
		{
			int L=1,R=12,ansyue;
			while(L<=R)
			{
				int mid=(L+R)/2;
				if(yue2[mid]>=r)
				{
					ansyue=mid;
					R=mid-1;
				}
				else
				{
					L=mid+1;
				}
			}
			r-=yue2[ansyue-1];
			printf("%lld %lld %lld \n",r,ansyue,1582+ansyear+400*Q);
		}
		else
		{
			int L=1,R=12,ansyue;
			while(L<=R)
			{
				int mid=(L+R)/2;
				if(yue1[mid]>=r)
				{
					ansyue=mid;
					R=mid-1;
				}
				else
				{
					L=mid+1;
				}
			}
			r-=yue1[ansyue-1];
			printf("%lld %lld %lld \n",r,ansyue,1582+ansyear+400*Q);
		}
	}
    return 0;
}

hack数据

1
2511810

正解 31 12 2164 结果 1 1 2165

2022/11/19 17:37
加载中...