题解 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;
}