因为年历是400年一个循环节的,所以递推出一年的情况,然后递推处理出一个循环节的情况。对于询问,求一个类似前缀和的东西就好了。
跑出来和比样例小一,把A和B加一以后交后AC...
写得时候注意变量的定义。。。不然WA到哭。。。我是以6代表星期5的,1900年是第一年,所以B,A减去1900之前要加一。
#include
#include
{if(y%100){return !(y&3);}else {return !(y%400);}
}// 1 3 5 7 8 10 12
int days[] = {-1,31,28,31,30,31,30,31,31,30,31,30,31};
//6 7 1 2 3 4 5
int cnt1[7];//1~2月
int cnt2[7];//2月以后
int cnt[7];//1900
void firstYear()
{int v &#61; 0;for(int m &#61; 1; m <&#61; 2; m&#43;&#43;) {cnt1[v]&#43;&#43;;v &#61; (v&#43;days[m])%7;}for(int m &#61; 3; m <&#61; 12; m&#43;&#43;) {cnt2[v]&#43;&#43;;v &#61; (v&#43;days[m])%7;}for(int i &#61; 0; i <7; i&#43;&#43;) {cnt[i] &#61; cnt1[i]&#43;cnt2[i];}
}int cnt400[401][13];
int cntCur[7];void circle()
{firstYear();int mov &#61; 0;int i &#61; 1;//1900for(int y &#61; 1900; y <2300; y&#43;&#43;,i&#43;&#43;){//1,1 &#43;mov1 1,2 2->last 1memset(cntCur,0,sizeof(cntCur));if(isLeapYear(y)) {for(int i &#61; 0; i <7; i&#43;&#43;)//2月以前不受影响cntCur[i] &#43;&#61; cnt1[(i-mov&#43;7)%7];mov &#61; (mov &#43; 1)%7;//相对上一年for(int i &#61; 0; i <7; i&#43;&#43;)cntCur[i] &#43;&#61; cnt2[(i-mov&#43;7)%7];}else {for(int i &#61; 0; i <7; i&#43;&#43;)cntCur[i] &#43;&#61; cnt[(i-mov&#43;7)%7];}mov &#61; (mov &#43; 1)%7;//365%7 &#61;1for(int j &#61; 0; j <13; j&#43;&#43;){cnt400[i][j] &#61; cnt400[i-1][j];}cnt400[i][cntCur[6]]&#43;&#43;;}
}int ans[13];
//#define local
int main()
{
#ifdef localfreopen("data.txt","w",stdout);
#endif // localint A,B;circle();scanf("%d%d",&A,&B);B&#43;&#43;;A&#43;&#43;;int a &#61; (A-1-1900)%400;int na &#61; (A-1-1900)/400;int b &#61; (B-1900)%400;int nb &#61; (B-1900)/400;for(int i &#61; 0; i <13; i&#43;&#43;){ans[i] &#43;&#61; (nb-na)*cnt400[400][i] &#43; cnt400[b][i] - cnt400[a][i];}for(int i &#61; 0; i <13; i&#43;&#43;)printf("%d: %d\n",i,ans[i]);return 0;
}