题解 P1202 【[USACO1.1]黑色星期五Friday the Thirteenth】

· · 题解

这题主要是模拟算法,找到寻找的规律就好做了
我的做法是:开一个大点的数组存每年每月13号的星期日期,再开两个平年闰年每月几天的数组,分这两种情况累加,第1个是6的定下的,然后继续找,直到1900+n+1年的结束,然后星期几统计个数,最后按要求输出就好了 上代码

//算法:数论,模拟 
#include<cstdio>
using namespace std;
int n,ans=0,t=0;
int a[7]={0},m=1;//a数组存星期的天数 
int c[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年一年的各个月天数 
int d[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//平年一年的各个月天数 
int b[100001];//存13号 
int main()
{
    scanf("%d",&n);//输入 
    b[++t]=6;//第一个是星期6 
    for(int i=1900;i<=n+1900-1;i++)//循环 
    {
        m=12;
        if(i%400==0||(i%4==0&&i%100!=0))//闰年 
        {
            for(int j=1;j<=12;j++)//循环找13号 
            {
                t++;
                b[t]=(b[t-1]+c[j])%7;
            }
        }
        else//平年 
        {
            for(int j=1;j<=12;j++)
            {
                t++;
                b[t]=(b[t-1]+d[j])%7;
            }
        }
    }
    for(int i=1;i<t;i++) a[b[i]]++;//累计 
    printf("%d ",a[6]);//输出 
    for(int i=0;i<=5;i++) printf("%d ",a[i]);
    return 0;
}