1 条题解
-
0
C++ :
//FJ-00445 //NOIP2020 RP++ #include<iostream> #include<cstdio> #define ll long long using namespace std; int T; int mp[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年的一月周期 int mr[12]={31,29,31,30,31,30,31,31,30,31,30,31};//闰年的一月周期 int sp[12]={31,28,31,30,31,30,31,31,30,21,30,31};//1582的一月周期 int yp[4]={366,365,365,365};//一年周期 ll n,ans; void solve1()//1581- { ans=n/1461*4;n%=1461;ll p,q;//四年周期 for(p=0;p<4 && n>=yp[p];p++) n-=yp[p],ans++;//一年周期 if(!p)//第一年为闰年 for(q=0;q<12 && n>=mr[q];q++) n-=mr[q];//闰年的一月周期 else for(q=0;q<12 && n>=mp[q];q++) n-=mp[q];//平年的一月周期 if(ans<4713) printf("%lld %lld %lld BC\n",n+1,q+1,4713-ans);//公元前 else printf("%lld %lld %lld\n",n+1,q+1,ans-4713+1);//公元后 } void solve2()//1583+ { n-=2299239;ans=1583;ll p,q;//快进到1583 if(n<365)//1583 for(q=0;q<12 && n>=mp[q];q++) n-=mp[q];//平年的一月周期 else if(n<6209)//1584-1599 { n-=365;ans++;//快进到1584 ans+=n/1461*4;n%=1461; for(p=0;p<4 && n>=yp[p];p++) n-=yp[p],ans++; if(!p) for(q=0;q<12 && n>=mr[q];q++) n-=mr[q]; else for(q=0;q<12 && n>=mp[q];q++) n-=mp[q]; } else//1600+ { n-=6209;ans=1600;//快进到1600 ans+=n/146097*400;n%=146097;//四百年周期 if(n<366)//只有第一个世纪年为闰年 for(q=0;q<12 && n>=mr[q];q++) n-=mr[q]; else { n--;//假装是第一个世纪年是平年,按照一般的一百年周期计算 ans+=n/36524*100;n%=36524;//一百年周期 if(n<365)//其余的世纪年均为平年 for(q=0;q<12 && n>=mp[q];q++) n-=mp[q]; else { n++;//假装世纪年为闰年,按照一般的四年周期计算 ans+=n/1461*4;n%=1461; for(p=0;p<4 && n>=yp[p];p++) n-=yp[p],ans++; if(!p) for(q=0;q<12 && n>=mr[q];q++) n-=mr[q]; else for(q=0;q<12 && n>=mp[q];q++) n-=mp[q]; } } } printf("%lld %lld %lld\n",n+1,q+1,ans); } void solve3()//1582 { n-=2298884;ans=1582;ll q;//快进到1582 for(q=0;q<12 && n>=sp[q];q++) n-=sp[q]; if(q==9 && n>3)//10月特判 n+=10; printf("%lld %lld %lld\n",n+1,q+1,ans); } int main() { scanf("%d",&T); while(T--) { scanf("%lld",&n); if(n<2298884) solve1(); else if(n>2299238) solve2(); else solve3(); } return 0; }
- 1
信息
- ID
- 3825
- 时间
- 4000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者