纪年
时间限制:1秒 空间限制:32M
知识点:枚举
网页链接
牛客tracker
牛客tracker & 每日一题,完成每日打卡,即可获得牛币。获得相应数量的牛币,能在【牛币兑换中心】,换取相应奖品!助力每日有题做,丰盈牛币日益多!
题目描述
C w b c CwbcCwbc和X H R l y b XHRlybXHRlyb在学习干支纪年法。
干支纪年法是中国历法上自古以来就一直使用的纪年方法。干支是天干和地支的总称。甲、乙、丙、丁、戊、己、庚、辛、壬、癸等十个符号叫天干;子、丑、寅、卯、辰、巳、午、未、申、酉、戌、亥等十二个符号叫地支。
为了方便程序的书写,我们不妨将天干记做1 11到10 1010,地支记做1 11到12 1212。
通过查阅日历,C w b c CwbcCwbc知道农历2018 20182018年是戊戌年,X H R l y b XHRlybXHRlyb想知道农历的n nn年是什么年。
0年指1年的前一年。
聪明的你在仔细阅读题目后,一定可以顺利的解决这个问题!
输入描述:
输入数据有多组数据,每行有一个整数,表示n nn。
输出描述:
输出数据应有多行,每行两个整数,分别表示天干和地支的编号。
示例1
输入:
2018输出:
5 11示例2
输入:
2020输出:
7 1备注:
n ∈ [ 0 , 10 18 ] n ∈ [0, 10^{18}]n∈[0,1018]。
1 ≤ T ≤ 1000 1 ≤ T ≤ 10001≤T≤1000。
解题思路
本题核心是周期循环规律+数学公式推导,解决超大年份的干支纪年查询问题。天干共10个(周期为10),地支共12个(周期为12),干支纪年以60为最小循环周期。已知2018年对应天干5、地支11,以此为基准推导出通用计算公式:对输入的年份n,通过取模运算计算其在天干、地支周期中的位置,处理模运算结果为0的边界情况(赋值为对应周期的最大值)。算法仅需常数级数学运算,时间复杂度O ( 1 ) O(1)O(1),无论年份n nn多大(最高10 18 10^{18}1018)、输入组数多少,都能极速输出结果,完美适配题目所有约束。
总结
核心逻辑:依托天干10、地支12的固定周期,用数学取模直接计算对应编号。
关键操作:基准年份推导公式、模运算边界值修正、常数级快速求解。
效率保障:无循环无枚举,纯数学计算,轻松处理超大年份与多组测试用例。
代码内容
#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'typedeflonglongll;typedefunsignedlonglongull;typedefvector<vector<ll>>vvt;typedefpair<ll,ll>pll;constll N=1e3+10;constll INF=1e18;constll M=1e6+10;constll mod=1e9+7;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);ll n;while(cin>>n){ll s=(n+9)%12;if(s==0)s=12;ll w=(n+7)%10;if(w==0)w=10;cout<<w<<" "<<s<<endl;}return0;}