社区讨论
40的废物
P7075[CSP-S 2020] 儒略日参与者 3已保存回复 10
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 10 条
- 当前快照
- 1 份
- 快照标识符
- @lo3ff0jz
- 此快照首次捕获于
- 2023/10/24 05:45 2 年前
- 此快照最后确认于
- 2023/10/24 05:45 2 年前
前面没问题后面误差越来越大
CPP#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;
}
回复
共 10 条回复,欢迎继续交流。
正在加载回复...