USACO Section 1.1 - Friday the Thirteenth

题意

计算自1900年n年以来每月13号是星期几的数量

思路

看到计算星期几就吐血三升。可耻地找了一个计算公式。

然后只要算出当月13号是本年的第几天就行,直接无脑暴力了。

代码

/*
ID: mycodeb1
LANG: C++
TASK: friday
*/
 
#include <bits/stdc++.h>
using namespace std;
 
int month[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int cnt[10];
 
bool isLeap(int n)
{
    if (!(n % 100))
        return n % 400 ? false : true;
    return n % 4 ? false : true;
}
 
void Solve(int X, int day)
{
    int S = X - 1 + (X - 1) / 4 - (X - 1) / 100 + (X - 1) / 400 + day;
    cnt[S % 7]++;
}
 
int main()
{
    //freopen("in.txt", "r", stdin);
    freopen("friday.in", "r", stdin);
    freopen("friday.out", "w", stdout);
 
    int n, i, j, base = 1900;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        isLeap(base + i) ? month[2]++ : 0;
        for (j = 1; j <= 12; j++)
        {
            int day = 0;
            for (int k = 1; k < j; k++)
                day += month[k];
            day += 13;
            Solve(base + i, day);
        }
        month[2] != 28 ? month[2] = 28 : 0;
    }
    printf("%d", cnt[6]);
    for (i = 0; i < 6; i++)
        printf(" %d", cnt[i]);
    printf("\n");
    return 0;
}

Powered by Jekyll and Theme by solid