(枚举) $O(n)$
C++ 代码
#include <bits/stdc++.h>
using namespace std;
int year1[]={0,31,29,31,30,31,30,31,31,30,31,30,31}; //闰年
int year2[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //平年
int n;
int ans[8]; //ans[0]表示星期日,ans1,2,3,4,5,6分别表示星期一到六
bool isrunyear(int x) { //判断是否闰年
return (x%4==0&&x%100!=0||x%400==0);
}
void solve(int x,int &a) { //需要传地址,a是不断被更新的
for (int i = 1; i <= 12; i ++) { //枚举12个月
ans[(13+a-1)%7]++; //找到每个月的13号是星期几
if(isrunyear(x)) {
a = year1[i]%7+a; //更新a
}
else {
a = year2[i]%7+a;
}
}
}
int main() {
cin >> n;
int a = 1; //a表示每个月的一号是星期几
for (int i = 1900; i <= 1900+n-1; i ++) {
solve(i,a);
}
printf("%d %d ",ans[6],ans[0]);
for (int i = 1; i <= 5; i ++) printf("%d ",ans[i]);
return 0;
}