ZOJ 3939 The Lucky Week

本文介绍了一种使用蔡勒公式确定特定日期是否为幸运日的方法,并通过编程实现了一个能够计算任意给定日期(包括年月日)在未来指定数量的重复周期后的新日期的应用程序。文章详细解释了如何构建数据结构存储这些幸运日期,以及如何利用二分查找算法快速定位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最后输出年份的时候公式算错了,应该用(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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值