HDU 6112 今夕何夕 数论
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 6112 今夕何夕 数论相关的知识,希望对你有一定的参考价值。
今夕何夕
Description
今天是2017年8月6日,农历闰六月十五。
小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨。
为了排遣郁结,它决定思考一个数学问题:接下来最近的哪一年里的同一个日子,和今天的星期数一样?比如今天是8月6日,星期日。下一个也是星期日的8月6日发生在2023年。
小贴士:在公历中,能被4整除但不能被100整除,或能被400整除的年份即为闰年。
Input
第一行为T,表示输入数据组数。
每组数据包含一个日期,格式为YYYY-MM-DD。
1 ≤ T ≤ 10000
YYYY ≥ 2017
日期一定是个合法的日期
Output
对每组数据输出答案年份,题目保证答案不会超过四位数。
Sample Input
3
2017-08-06
2017-08-07
2018-01-01
Sample Output
2023
2023
2024
题意
给定一个合法日期如X年m月d日,询问这之后的哪一年m月d日和X年m月d日的星期几相同。
题解
基姆拉尔森计算公式:
W = (D + 2 * M + 3 * (M + 1) \\ 5 + Y + Y \\ 4 - Y \\ 100 + Y \\ 400) Mod 7
【预处理:当年的1月、2月转换至去年的13月、14月】
注意在计算2月29的时候先判断是否存在(跪在这里WA了3发)
代码
1 //HDU-6112 copyright:scidylanpno 2 #include<bits/stdc++.h> 3 using namespace std; 4 5 int GetDay(int y,int m,int d){ 6 7 if(m==1||m==2) y-=1,m+=12; 8 int ans= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) % 7; 9 return ans; 10 } 11 12 void Run() 13 { 14 char str[20]; 15 int y=0,m=0,d=0; 16 scanf("%s",str); 17 for(int i=0;i<4;i++) 18 { 19 y*=10; 20 y+=(str[i]-‘0‘); 21 } 22 for(int i=5;i<=6;i++) 23 { 24 m*=10; 25 m+=(str[i]-‘0‘); 26 } 27 for(int i=8;i<=9;i++) 28 { 29 d*=10; 30 d+=(str[i]-‘0‘); 31 } 32 int W=GetDay(y,m,d); 33 if(m==2&&d==29) 34 for(int Y=y+4;;Y+=4) 35 { 36 if((Y%400==0||(Y%4==0&&Y%100!=0))&&W==GetDay(Y,m,d)) 37 { 38 39 printf("%d",Y); 40 return; 41 } 42 } 43 44 for(int Y=y+1;;Y++) 45 { 46 if(W==GetDay(Y,m,d)) 47 { 48 49 printf("%d",Y); 50 return; 51 } 52 } 53 } 54 55 int main() 56 { 57 int T; 58 scanf("%d",&T); 59 while(T--) 60 { 61 Run(); 62 //if(T) 63 printf("\\n"); 64 } 65 return 0; 66 }
题解链接:http://www.cnblogs.com/scidylanpno/p/7354392.html
版权所有:scidylanpno
以上是关于HDU 6112 今夕何夕 数论的主要内容,如果未能解决你的问题,请参考以下文章
2017"百度之星"程序设计大赛 - 初赛(A)-1001.小C的倍数问题(HDU6108) 1005.今夕何夕-蔡勒公式 (HDU6112)