ZOJ3939 The Lucky Week

幸運星期指,星期一爲每個月的1 or 11 or 21號。給出第一個幸運星期的時間,問第n個幸運星期的日期。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

typedef long long ll;
const int N=100005;
const int Max=1753+2800;
//返回指定日期是星期幾


int yy[N],mm[N],dd[N];
int id[10005][20][50];
//模板 計算日期是星期幾 返回0~6 代表星期7 1~6
int weekday(int y,int m,int d){

       int tm=m>=3?(m-2):(m+10);

       int ty=m>=3?y:(y-1);

       return (ty+ty/4-ty/100+ty/400+(int)(2.6*tm-0.2)+d)%7;

}



int main()
{
    int leap;
    int c=0;
    for(int i=1753;i<Max;i++){

        for(int j=1;j<=12;j++){

                if(weekday(i,j,1)==1){
                        yy[c]=i;
                        mm[c]=j;
                        dd[c]=1;
                        id[i][j][1]=c++;
                }
                if(weekday(i,j,11)==1){
                        yy[c]=i;
                        mm[c]=j;
                        dd[c]=11;
                        id[i][j][11]=c++;
                }
                if(weekday(i,j,21)==1){
                        yy[c]=i;
                        mm[c]=j;
                        dd[c]=21;
                        id[i][j][21]=c++;
                }
        }
    }

    int t;
    cin>>t;
    while(t--){

        int Y,M,D,n;
        cin>>Y>>M>>D>>n;
        int y=Y;
        while(y>=Max){
            y-=2800;
        }

        int idd=id[y][M][D];
       // cout<<idd<<endl;
        int nn=(idd+n-1)%c;
        //cout<<yy[nn]<<endl;
        int m=mm[nn],d=dd[nn];
        //cout<<Y<<endl;
        ll yyy=1ll*Y+1ll*(idd+n-1)/c*2800+1ll*(yy[nn]-y);
        cout<<yyy<<" "<<m<<" "<<d<<endl;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章