D.Distribution of Days

The Gregorian calendar is internationally the most widely used civil calendar. It is named after Pope Gregory XIII, who introduced it in October 1582.

In the Gregorian calendar, there are 28 days in February in a common year and 29days in February in a leap year. Year Y is a leap year if and only if Y is a multiple of 400, or Y is a multiple of 4 and is not a multiple of 100.

Percy is curious about the distribution of days of the week of his birthday in his life. By checking the calendar, he quickly finds that in the years between 1999 and 2017 (inclusive), his birthday (in case you do not know, 27 February) appears only twice on both Tuesday and Thursday, three times on each of the other days of the week.

Percy finds counting the distribution of some days in some consecutive years really cool, so he decides to invent a way to quickly count the distribution.

Within 15 minutes, he successfully invented a fast program to do the calculation for years between 1583 and 2 × 109, inclusive. His program can answer 5000 queries in 1second. However, he is not sure if the program works correctly, so he needs your help. Your task is simple, write your own program to do the calculation, so that Percy can check his program's correctness by comparing the outputs of different queries with your program.

In this problem, please assume the definition of leap years mentioned above is true for all years between 1583 and 2 × 109, inclusive.

Input

The first line consists of a single integer, Q, denotes the number of queries. (1 ≤ Q ≤ 5000)

In the next Q lines, each describes a single query. The queries are in the format S E M D, which means you have to calculate the distribution of days of the week for the D-th day of the M-th month for all years between S and E, inclusive. (1583 ≤ S ≤ E ≤ 2 × 109, the days given are one of the 366 valid days)

Output

Output Q lines, each answers a query given.

In each line output 7 integers, the frequencies of days of the weeks in this order: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday.

The order of answers should follow the order of queries given.

Example

Input
1
1999 2017 2 27
Output
3 3 2 3 2 3 3
Input
2
2017 2017 8 15
2017 2021 2 29
Output
0 0 1 0 0 0 0
0 0 0 0 0 0 1
Input
4
3141 5926 5 3
5897 9323 8 4
2718 2818 2 8
2222 2222 2 22
Output
404 391 403 390 404 396 398
488 488 497 481 497 480 496
15 14 14 15 14 15 14
0 0 0 0 0 1 0

这个题根本就没有什么技术含量,但是我写T了,

基姆拉尔森计算公式不好用,慎用。

正解(不是我写的,我的T了,不想改了)

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 #include<cmath>
6 #include<stack>
7 #include<map>
8 #include<vector>
9 #include<set>
10 #include<queue>
11 using namespace std;
12 typedef long long ll;
13 const int MAXN=1e5+10;
14 const double mod=1e16+7;
15 int isr(int n)
16 {
17 if(n%4==0&&n%100!=0||n%400==0)return 1;
18 else return 0;
19 }
20 int da[810][15][35];
21
22 void init()
23 {
24 int k[15],l=6;
25 k[1]=31,k[2]=28,k[3]=31,k[4]=30,k[5]=31,k[6]=30;
26 k[7]=31,k[8]=31,k[9]=30,k[10]=31,k[11]=30,k[12]=31;
27 memset(da,0,sizeof(da));
28 for(int i=0;i<=399;i++){
29 for(int j=1;j<=12;j++){
30 if(j==2)
31 for(int t=1;t<=k[j]+isr(i);t++){
32 if(l+1==8)l=0;
33 da[i][j][t]=++l,da[i+400][j][t]=l;
34 }
35 else
36 for(int t=1;t<=k[j];t++){
37 if(l+1==8)l=0;
38 da[i][j][t]=++l,da[i+400][j][t]=l;
39 }
40 }
41 }
42 }
43
44 int main()
45 {
46 int q,y1,y2,m,d,t;
47 ll s[10];
48 cin>>q;
49 init();
50 while(q--){
51 memset(s,0,sizeof(s));
52 scanf("%d%d%d%d",&y1,&y2,&m,&d);
53 if(y2-y1>=400){
54 t=(y2-y1)/400;
55 for(int i=1;i<=400;i++)
56 s[da[i][m][d]]+=t;
57 }
58 y1%=400,y2%=400;
59 if(y1>y2) y2+=400;
60 for(int i=y1;i<=y2;i++){
61 s[da[i][m][d]]++;
62 }
63 for(int i=1;i<=7;i++)
64 cout<<s[i]<<" ";
65 cout<<endl;
66 }
67 }

贴一下我的超时垃圾代码:

 1 #include<iostream>
2 #include<cstring>
3 #include<cstdio>
4 #include<cmath>
5 #include<math.h>
6 using namespace std;
7 int CaculateWeekDay(int y,int m, int d){
8 if(m==1||m==2){
9 m+=12;
10 y--;
11 }
12 int iWeek=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;//基姆拉尔森计算公式根据日期判断星期几
13 if(m==2&&d==29) return iWeek+15;
14 return iWeek+1;
15 }
16 int b[30];
17 int year1=0,year2=0,month=0,day=0;
18 void isbb(){
19 memset(b,0,sizeof(b));
20 for(int i=1;i<=400;i++){
21 int temp=CaculateWeekDay(i,month,day);
22 b[temp]++;
23 }
24 }
25 int main(){
26 int a[10];
27 int t;
28 while(~scanf("%d",&t)){
29 while(t--){
30 scanf("%d%d%d%d",&year1,&year2,&month,&day);
31 memset(a,0,sizeof(a));
32 isbb();
33 if((year2-year1)/400){
34 int x=(year2-year1)/400;
35 if(month==2&&day==29){
36 int j=1;
37 for(int i=15;i<=22;i++)
38 a[j++]=b[i];
39 }
40 else{
41 for(int i=1;i<=7;i++)
42 a[i]=b[i];
43 }
44 for(int i=1;i<=7;i++)
45 a[i]*=x;
46 year1%=400;
47 if(year2%400<year1)year2=year2%400+400;
48 else year2%=400;
49 for(int i=year1;i<=year2;i++){
50 if(month==2&&day==29){
51 if(i%400==0){
52 int temp=CaculateWeekDay(i,month,day);
53 a[temp-15]++;
54 }
55 }
56 else{
57 int temp=CaculateWeekDay(i,month,day);
58 a[temp]++;
59 }
60 }
61 }
62 else{
63 for(int i=year1;i<=year2;i++){
64 int temp=CaculateWeekDay(i,month,day);
65 a[temp]++;
66 }
67 }
68 }
69 cout<<a[7];
70 for(int i=1;i<=6;i++)
71 cout<<" "<<a[i];
72 cout<<endl;
73 }
74 return 0;
75 }

心累。。。

最新文章

  1. [Java] JSP笔记 - Listener 监听器
  2. flex布局
  3. vmware虚拟机网络自动断开的问题
  4. JavaScript中的跨域
  5. 【leetcode❤python】 160. Intersection of Two Linked Lists
  6. 为什么不推崇复杂的ORM
  7. centos6.8部署vnc服务
  8. 股票自用指标 boll 菜刀
  9. bootstrap-内联表单 水平(横向)表单 响应式图片 辅助类 [转]
  10. Android 开发无线调试
  11. The error indicates that IIS is in 32 bit mode, while this application is a 64 b it application and thus not compatible.
  12. C++构造 下一个排列 的函数
  13. JavaScript 动态显示当前时间
  14. Python图像处理之验证码识别
  15. java Swing组件和事件处理(二)
  16. JxBrowser之一:Java嵌入Chrome浏览器
  17. A Network-based End-to-End Trainable Task-oriented Dialogue System
  18. [UE4]Scroll Box带滚动条的容器
  19. mac挂载分区包括EFI 或者任何隐藏分区
  20. vue侧边栏导航和右边内容一样高

热门文章

  1. day13内置函数
  2. FZU 2082 过路费(树链剖分)
  3. UVALive 4685 Succession 树DP+背包
  4. 全球征集-如何实现回文SQL的查询
  5. mysql之面试问题总结
  6. ObjectOutputStream和ObjectInputStream的简单使用
  7. day 17 jQuery
  8. 【Minimum Path Sum】cpp
  9. IOS笔记047-代理传值和block传值
  10. PyInstaller打包python脚本