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 今夕何夕 数论的主要内容,如果未能解决你的问题,请参考以下文章

hdu 6112 今夕何夕

hdu 6112 今夕何夕(模拟)

Zeller公式计算星期几HDU 6112 今夕何夕

百度之星初赛A hdu6112

2017"百度之星"程序设计大赛 - 初赛(A)-1001.小C的倍数问题(HDU6108) 1005.今夕何夕-蔡勒公式 (HDU6112)

百度之星初赛A轮 hdu 6108 6112 6113