ZZNU 2055(基姆拉尔森计算公式)
题目链接
题意:
比如今天是2017年8月16日,星期三。下一个也是星期三的8月16日发生在2023年。
现在是日期是yyyy-mm-dd,我们希望你求出薛定谔会跳跃到那一年。
题解:
emmmm....强哉队花,科普“基姆拉尔森计算公式”,之后特判下闰年这题就能水过了:
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
AC代码:
#include <stdio.h> #include <stdlib.h> #include <cmath> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <vector> #include <string> #include <ctype.h> //****************************************************** #define lrt (rt*2) #define rrt (rt*2+1) #define LL long long #define inf 0x3f3f3f3f #define pi acos(-1.0) #define exp 1e-8 //*************************************************** #define eps 1e-8 #define inf 0x3f3f3f3f #define INF 2e18 #define LL long long #define ULL unsigned long long #define PI acos(-1.0) #define pb push_back #define mk make_pair #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define SQR(a) ((a)*(a)) #define Unique(a) sort(all(a)),a.erase(unique(all(a)),a.end()) #define min3(a,b,c) min(a,min(b,c)) #define max3(a,b,c) max(a,max(b,c)) #define min4(a,b,c,d) min(min(a,b),min(c,d)) #define max4(a,b,c,d) max(max(a,b),max(c,d)) #define max5(a,b,c,d,e) max(max3(a,b,c),max(d,e)) #define min5(a,b,c,d,e) min(min3(a,b,c),min(d,e)) #define Iterator(a) __typeof__(a.begin()) #define rIterator(a) __typeof__(a.rbegin()) #define FastRead ios_base::sync_with_stdio(0);cin.tie(0) #define CasePrint pc('C'); pc('a'); pc('s'); pc('e'); pc(' '); write(qq++,false); pc(':'); pc(' ') #define vi vector <int> #define vL vector <LL> #define For(I,A,B) for(int I = (A); I < (B); ++I) #define FOR(I,A,B) for(int I = (A); I <= (B); ++I) #define rFor(I,A,B) for(int I = (A); I >= (B); --I) #define Rep(I,N) For(I,0,N) #define REP(I,N) FOR(I,1,N) using namespace std; const int maxn=1e5+10; int Isyear(int y) { if( y%400==0 || (y%4==0&&y%100!=0) ) return 1; else return 0; } int Day(int y,int m,int d) { if(m==1 || m==2) m+=12,y-=1; return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7; } int main() { FastRead; int t,d,m,y;; cin>>t; while(t--) { int w,w2; char ch1,ch2; cin>>y>>ch1>>m>>ch2>>d; w=Day(y,m,d); w2=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7; if(m==2&&d==29) { while(1) { y++; if(Isyear(y)) { w2=Day(y,m,d); if(w2==w) break; } } } else { while(1) { y++; w2=Day(y,m,d); if(w2==w) break; } } cout<<y<<endl; } return 0; }