幸運星期指,星期一爲每個月的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;
}
}