20111026

USACO Friday the Thirteenth

就只是個數饅頭……
除了第一年的1月另外計算,
往後的1月13號都是去年的12月13號 + 31(DEC)。

/*
ID: mythnc2
LANG: C
TASK: friday
2011/10/26 19:37:31   
*/
#include <stdio.h>
 
#define MONTHS      12
#define FIRSTYEAR 1900
#define WEEK         7
 
int leap(int);
 
int main (void)
{
    FILE *fin, *fout;
    int n, i, j, day;
    int thirteen[WEEK] = { 0 };
    int month[MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    enum Months {JAN, FEB};
 
    fin = fopen("friday.in", "r");
    fout = fopen("friday.out", "w");
 
    fscanf(fin, "%d", &n);
 
    /* simplify months */
    for (i = 0; i < MONTHS; i++)
        month[i] %= WEEK;
 
    for (day = 1 + 12, i = 0; i < n; i++) {
        if (i > 0)       /* DEC/13 + 31 = JAN/13 */
            day += month[j];
        day %= WEEK;
        thirteen[day]++;
        for (j = JAN; j < MONTHS - 1; j++) {
            day += month[j];
            if (j == FEB && leap(i))
                day++;
            day %= WEEK;
            thirteen[day]++;
        }
    }
    /* printout: from sat to fri */
    fprintf(fout, "%d", thirteen[WEEK - 1]);
    for (i = 0; i < WEEK - 1; i++)
        fprintf(fout, " %d", thirteen[i]);
    fprintf(fout, "\n");
    return 0;
}
 
/* leap: calculate the year is a leap year or not
 * return 1 if is, 0 if is not */
int leap(int i)
{
    int year;
 
    year = FIRSTYEAR + i;
    return year % 4 == 0 && year % 100 != 0
           || year % 400 == 0;
}

沒有留言: