HDU --- 6112 今夕何夕【公式 + 枚举】

传送门
//其实知道这个公式的话还是很好做的.
蔡勒公式 和 基姆拉尔森计算公式
//我用的是后面那个公式, 因为前面那个公式需要分解年份, 而后面那个公式可以直接带入年份.

//题意: 找距离给出的年份最近的同年同月同日与给的这一天星期相同.
//所以直接套公式加枚举一下就行了, 注意特判一下2月29号, 因为只有闰年才有.

AC Code

/** @Cain*/
bool check(int y)   //检查是否是闰年.
{
    if((y%4==0 && y%100!=0) || y%400 == 0) return true;
    return false;
}
int cal(int y,int m,int d)
{
    if(m<=2){
        m+=12;
        y--;
    }
    int w = d + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400 + 1 ;
    w %= 7;
    return w == 0 ? 7 : w;  //1-星期一,.....,0-星期日
}
bool judge(int now,int m,int d)   //特判2月29号.
{
    if(!check(now) && m==2 && d==29) return false;
    return true;
}

void solve()
{
    int y,m,d;
    scanf("%d-%d-%d",&y,&m,&d);
    int res = cal(y,m,d);
    for(int i=y+1;;i++){
        int ans = cal(i,m,d);
        if(!judge(i,m,d)) continue;//如果给的是2月29号,但是这一年不是闰年,则不用判断.
        if(ans == res){   //相等就输出答案.
            printf("%d\n",i);
            break;
        }
    }
}

你可能感兴趣的:(暴力/分块/枚举技巧)