首页 > 其他分享 >[CSP-S2020] 儒略日 题解

[CSP-S2020] 儒略日 题解

时间:2023-10-30 21:57:14浏览次数:38  
标签:13 ++ 题解 month 儒略 while 计算 chkge CSP

[CSP-S2020] 儒略日

今儿终于做掉困扰多年的题目了,其实想好细节也不难。

容易发现儒略历和格里高利历的润年判断方式不一样,并且中间有消失的十天,计算起来相当不方便。所以我们可以首先计算出 \(-4713.1.1\) ~ \(1582.10.4\) 会经过多少天,可以通过一天一天暴力跳的方法计算出需要 \(2299160\),那么对于小于等于该数字的情况,直接按照儒略历的计算方式从 \(-4713.1.1\) 计算即可,否则先将天数减去 \(2299161\) 然后按照格里高利历从 \(1582.10.15\) 开始计算。

对于儒略历,可以发现,4年一闰,所以先除掉4年的天数,然后一月一月的跳,最后一天一天地跳。

对于格里高利历,400年总共有97闰,所以先400年跳,然后一年一年跳,再一月一月跳,最后一天一天跳。

对于代码实现,可以使用查表的方式简化计算。

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

typedef long long LL;
LL read() {
    LL sum=0,flag=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') flag=-1; c=getchar();}
    while(c>='0'&&c<='9') {sum=sum*10+c-'0'; c=getchar();}
    return sum*flag;
}

#define int LL
int T;
int year[2]={365,366};
int month[13][2]={{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};

inline int chkru(int x) {
    if(x<0) x++;
    if(x%4==0) return 1;
    else return 0;
}

inline int chkge(int x) {
    if((x%4==0&&x%100!=0)||x%400==0) return 1;
    else return 0;
}

inline void calc_ru(int n) {
    int a=-4713,b=1,c=1;
    a=a+4*int(n/1461); n%=1461;
    if(a>=0) a++;
    while(n>=month[b][chkru(a)]) {
        n-=month[b][chkru(a)];
        b++;
        if(b==13) {
            b=1;
            if(a==-1) a=1;
            else a++;
        }
    }
    while(n--) {
        c++;
        if(c==month[b][chkru(a)]+1) {
            c=1; b++;
            if(b==13) {
                b=1;
                if(a==-1) a=1;
                else a++;
            }
        }
    }
    if(a<0) cout<<c<<" "<<b<<" "<<-a<<" BC"<<endl;
    else cout<<c<<" "<<b<<" "<<a<<endl;
}

inline void calc_ge(int n) {
    int a=1582,b=10,c=15;
    a=a+400*int(n/146097); n%=146097;
    while(n>=year[chkge(a+1)]) {
        n-=year[chkge(a+1)];
        a++;
    }
    while(n>=month[b][chkge(a)]) {
        n-=month[b][chkge(a)];
        b++; if(b==13) {b=1; a++;}
    }
    while(n--) {
        c++;
        if(c==month[b][chkge(a)]+1) {
            c=1; b++;
            if(b==13) {b=1; a++;}
        }
    }
    cout<<c<<" "<<b<<" "<<a<<endl;
}

signed main() {
    cin>>T;
    while(T--) {
        int n; cin>>n;
        if(n<=2299160) calc_ru(n);
        else calc_ge(n-2299161);
    }
}

标签:13,++,题解,month,儒略,while,计算,chkge,CSP
From: https://www.cnblogs.com/zhangyuzhe/p/17798941.html

相关文章

  • CSP-J 前三题详解
    没写完。先补会儿文化课作业,等会再回来继续写。T1P9748[CSP-J2023]小苹果令苹果数量为\(\texttt{n}\)。容易发现,拿苹果就是每三个一组,取第一个。需要注意的是,如果以三个一组来考虑拿苹果,最后几个苹果不满三个时也应该算一个组,第一个也要拿走。形式化的,即当\(\texttt{n}......
  • 周藤 CSP-2023游记
    Day-inf~Day-2基本上是考试状态,每天我都是自己取随机题目做,不过也保证了落实量每场模拟赛发挥基本上是不是特别稳定,考得好的时候AK了,考不好的时候只有300分,反正同届差不多第一吧。。。不过还被几个人诅咒爆零了,不过没事,一交解千愁/seDay-1教练说了考试注意事项,然后就去娱......
  • P4309 [TJOI2013] 最长上升子序列题解
    P4309[TJOI2013]最长上升子序列题解正文单调队列?单调锤子队列!!本题的操作可以省略成:单点修改区间查询好极了,此时我们有两种选择:线段树和树状数组,(平衡树,真不会,下一位因为不需要其他操作,所以我们还是选择更小巧更可爱的树状数组吧。关于vectorvector的insert操作支......
  • 题解 ABC326G【Unlock Achievement】
    题解ABC326G【UnlockAchievement】problem有\(n\)项属性,第\(j\)个属性的等级\(l_j\)初始为\(1\),每提升一级花费\(c_j\)的钱。又有\(m\)项成就,第\(i\)项成就要求对于所有\(1\leqj\leqn\),都要\(l_j\geqL_{i,j}\),如果满足所有要求,获得\(a_i\)的钱。求你最多......
  • ADASTRNG - Ada and Substring 题解
    ADASTRNG-AdaandSubstring题解题目描述给定一个小写字符串。输出\(26\)个数,代表以\(\texttt{a}\sim\texttt{z}\)开头的本质不同的子串个数。题目分析高度数组模板题。可以想到将以每个字符开头的本质不同的子串数目转化为:以每个字符开头的所有字串数目减去以每......
  • Luogu P4168 [Violet] 蒲公英 题解
    题目链接[Violet]蒲公英分析可以先将\(a[i]\)离散化然后考虑分块对于询问\(x,y\),\(x\)属于\(p\),\(y\)属于\(q\)当\(q-p<=1\)时直接暴力枚举即可,时间复杂度为\(O(\sqrt{n})\)\(else\)如图中间为分好块的地方我们发现,\(ans\)只可能为中间的众数或两边的......
  • CSP-J/S游记
    Day-4摆烂Day-3摆烂Day-2摆烂Day-1摆烂Day0看了眼板子,赌今年不考字符串算法(真的没考)Day1上午J组,\(T2\)30分钟切掉了,\(T3\)模拟,写加调了40分钟过了,\(T4\)不会,写了个50分的暴力,结束。上午我做完题一直在对拍什么的,感觉有点浪费体力。中午休息了一下,和clp、l......
  • 2023年10月第四周题解------输入与输出
     问题A:ly喜欢玩石头 解题思路题目告诉我们(1<=a,b<=1e9),那么int类型就够了。因为这两个数相加最大为20亿定义两个变量a和b输入a和b的值打印a加b的值#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>#include<time.h>intmain......
  • CSP-S 2023 消消乐
    洛谷传送门考虑dp,设\(f_i\)为以\(i\)结尾的合法子串个数。如果我们能对每个\(i\),求出来\(g_i\)表示最大的左端点\(l\)使得\([l,i]\)是合法串,那么\(f_i=f_{g_i-1}+1\)。若\(g_i\)不存在则\(f_i=0\)。答案为\(\sum\limits_{i=1}^nf_i\)。考虑求\(g_......
  • 题解:「NOIP2022 提高组」种花
    题解:「NOIP2022提高组」种花题目大意:给定一个\(n\timesm\)的01矩阵,0表示可以种花,1表示土坑(无法种花),现在要在图上种出一个C型或F型(C,F横着的两条线的长度都可以不同,但一定是面向右边的),现在问你种C和F分别有多少种方案(除了这个形状外不能在任何地方种花),多组数据,\(T\leq5\)。......