1002. 【USACO题库】1.1.3 Friday the Thirteenth 黑色星期五
(Input: friday.in, Output: friday.out)
时间限制: 1 s 空间限制: 256 MB
题目描述
每月 13 号刚好落在星期五的情况,是不是一定比落在其他星期一~星期四,还有落在周末的这些情况少呢?为了回答这个问题,写一个程序来计算在连续的 n 年中,每月的 13 日落在星期一,星期二……星期日的次数。具体时间段从 1900 年 1 月 1 日到 1900+n-1 年 12 月 31 日。其中 n 是一个非负数且不大于 400。
需要注意的是:
- 1900 年 1 月 1 日是星期一。
- 4, 6, 9 和 11 月有 30 天,其他月份(除了 2 月)有 31 天。闰年 2 月有 29 天,平年 2 月有 28 天。
- 年份可以被 4 整除的为闰年(比如,1992=4×498 所以 1992 年是闰年,但 1990 年不是闰年)。
- 以上规则不适用于世纪年(即数字刚好为整百的年)。可以被 400 整除的世纪年为闰年,否则为平年。所以,1700,1800,1900 和 2100 年是平年,而 2000 年是闰年。
请不要调用程序语言提供的任何日期相关的内置函数。也请不要预先算好所有答案。
输入
从文件 friday.in
中读入数据。
一个整数 n。
输出
输出到文件 friday.out
中。
一行 7 个整数,代表 13 日是星期六,星期日,星期一……星期五的次数。
样例数据
输入 #1
20
输出 #1
36 33 34 33 35 35 34
#include<bits/stdc++.h>
using namespace std;
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool q(int a)
{return(a%400==0||(a%100!=0&&a%4==0));
}
int w[10];
int main()
{freopen("friday.in","r",stdin);freopen("friday.out","w",stdout);int n,s=0;cin>>n;for(int i=1900;i<=1900+n-1;i++){if(q(i))m[2]=29;else m[2]=28;for(int j=1;j<=12;j++){w[(s+13)%7]++;s+=m[j];}}cout<<w[6];for(int i=0;i<=5;i++)cout<<" "<<w[i];
}