最后过的一道题,看队友的样子,貌似是神烦的题
2800年一循环,菜勒公式可以搞
代码:
#include<cstdio> #include<cstring> #include<iostream> long long sum[2801][13]; void init() { memset(sum,0,sizeof(sum)); long long count=0; for(int i=1;i<=2800;i++) { for(int j=1;j<=12;j++) { int y,m,d; y=2016+i-1; m=j; if(m==1) { y=y-1; m=13; } else if(m==2) { y=y-1; m=14; } if((1 + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7==0) { sum[i][j]=count+7; count+=7; } else sum[i][j]=count; } } // printf("%lld\n",sum[2800][12]); return; } long long F(long long y,long long m,long long d) { long long ans=0; ans+=(y-2016)/2800*sum[2800][12]; //printf("%lld\n",ans); long long tmp=y; tmp=(tmp-2016)%2800+2016; if(m>1) ans+=(sum[tmp-2016+1][m-1]); else if(m==1&&tmp>2016) ans+=(sum[tmp-2016][12]); //printf("%d %d\n",tmp-2016+1,m-1); // printf("%lld\n",sum[tmp-2016+1][m-1]); if(m==1) { y-=1; m=13; } else if(m==2) { y-=1; m=14; } for(long long i=1;i<=d;i++) { if((i + 2*m + 3*(m+1)/5 + y + y/4 - y/100 + y/400) % 7==i-1) ans++; } // printf("%d\n",ans); return ans; } int main() { init(); int t; scanf("%d",&t); while(t--) { long long x1,y1,z1,x2,y2,z2; scanf("%lld%lld%lld%lld%lld%lld",&x1,&y1,&z1,&x2,&y2,&z2); long long ans1=F(x1,y1,z1); long long ans2=F(x2,y2,z2); long long ans=ans2-ans1; //printf("%lld\n",ans); if(y1==1) { y1=13; x1-=1; } else if(y1==2) { x1-=1; y1=14; } if((z1 + 2*y1 + 3*(y1+1)/5 + x1 + x1/4 - x1/100 + x1/400) % 7==z1-1) ans++; printf("%lld\n",ans); } }