您的位置:首页 > 其它

ZOJ 3939 The Lucky Week

2016-06-05 23:14 337 查看
最后输出年份的时候公式算错了,应该用(n+l-1)/2058算出增加的年数,而y/400则代表原来的年数,她们最后相加乘以400再加上从表里搜索到的年数救赎所求年了。

打表时用到了蔡勒公式。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
struct year{
int y,m,d;
}lucky[5000];
int len=0;
bool luckyweek(int y,int m,int d)
{
int c=y/100;
y=y%100;
if(m==1) {y=y-1;m=13;}
else if(m==2) {y=y-1;m=14;}
int w=c/4-2*c+y+y/4+13*(m+1)/5+d-1;
if(w%7==1) return true;
else return false;
}
void solve()
{
for(int i=0;i<400;i++)
{
for(int j=1;j<=12;j++)
{
if(luckyweek(i,j,1)) {lucky[len].y=i;lucky[len].m=j;lucky[len].d=1;len++;}
else if(luckyweek(i,j,11)) {lucky[len].y=i;lucky[len].m=j;lucky[len].d=11;len++;}
else if(luckyweek(i,j,21)) {lucky[len].y=i;lucky[len].m=j;lucky[len].d=21;len++;}
}
}
}
int binary_search(int y,int m,int d)
{
int i=0,j=len;
int mid=0;
while(i<=j)
{
mid=(i+j)/2;
if(lucky[mid].y==y&&lucky[mid].m==m&&lucky[mid].d==d) return mid;
else if(lucky[mid].y>y) j=mid;
else if(lucky[mid].y==y&&lucky[mid].m>m) j=mid;
else if(lucky[mid].y==y&&lucky[mid].m==m&&lucky[mid].d>d) j=mid;
else i=mid;
}
return 0;
}
int main()
{
solve();
int t;
scanf("%d",&t);
while(t--)
{
int y,m,d,n;
scanf("%d%d%d%d",&y,&m,&d,&n);
int q=y%400;
int l=binary_search(q,m,d);
int p=(l+n-1)/2058+y/400;
int k=(l+n-1)%2058;
cout<<p*400+lucky[k].y<<" "<<lucky[k].m<<" "<<lucky[k].d<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: