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 }

心累。。。

Codeforces Gym101522 D.Distribution of Days-算日期 (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)的更多相关文章

  1. Codeforces Gym101522 C.Cheering-字符串 (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)

    C.Cheering To boost contestants' performances in the 20th La Salle - Pui Ching Programming Challenge ...

  2. Codeforces Gym101522 A. Ambiguous Dates (La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017)

    A. Ambiguous Dates There are two popular formats for representing a date: day/month/year or month/da ...

  3. gym101522 [小熊骑士限定]La Salle-Pui Ching Programming Challenge 培正喇沙編程挑戰賽 2017

    西瓜队(划掉),Kuma Rider久违的第一场训练,四小时瞎打.jpg A.水题,排序 #include<cstdio> #include<iostream> #includ ...

  4. Codeforces 1167C - News Distribution

    题目链接:http://codeforces.com/problemset/problem/1167/C 题意:大概就是分成几个小团体,给每个人用1 - n编号,当对某个人传播消息的时候,整个小团体就 ...

  5. Codeforces 1090A - Company Merging - [签到水题][2018-2019 Russia Open High School Programming Contest Problem A]

    题目链接:https://codeforces.com/contest/1090/problem/A A conglomerate consists of n companies. To make m ...

  6. 【Teradata】日期类型计算

    1.EXTRACT(抽取年/月/日/时/分/秒)  //抽取年/月/日/时/分/秒 SELECT EXTRACT (YEAR FROM CURRENT_DATE); SELECT EXTRACT (M ...

  7. Python datetime time 等时间 日期 之间的计算和相互转化

    from datetime import datetime, date, timedelta, timezone from time import time, ctime, localtime, st ...

  8. Java8新特性--日期和时间API

    如何正确处理时间 现实生活的世界里,时间是不断向前的,如果向前追溯时间的起点,可能是宇宙出生时,又或是是宇宙出现之前, 但肯定是我们目前无法找到的,我们不知道现在距离时间原点的精确距离.所以我们要表示 ...

  9. CodeForces 164 B. Ancient Berland Hieroglyphs 单调队列

    B. Ancient Berland Hieroglyphs 题目连接: http://codeforces.com/problemset/problem/164/B Descriptionww.co ...

随机推荐

  1. PAT乙级1088

    1088 三人行 (20 分) 子曰:“三人行,必有我师焉.择其善者而从之,其不善者而改之.” 本题给定甲.乙.丙三个人的能力值关系为:甲的能力值确定是 2 位正整数:把甲的能力值的 2 个数字调换位 ...

  2. (HTML)写导航感悟

    代码要规范,路径要写全 如: .div1 ul li a:link { text-decoration: none; color: white; } .div1 ul li a:visited { t ...

  3. 【Jump Game】cpp

    题目: Given an array of non-negative integers, you are initially positioned at the first index of the ...

  4. IOS开发学习笔记033-UIScrollView

    1.滚动显示图片 如果图片过大,则需要滚动显示,这是需要用到类UIScrollView,可是实现控件的水平和垂直滚动. 可用三步实现:1 设置UIScrollView,2 设置UIImageView, ...

  5. 如何部署安装软件:vs2010 'VS' Inno Setup

    一直以来就是调试程序,生成的文件在debug或者release下,当没有其他资源文件时,这些程序也不用打包,直接就能够运行,但是程序中总会有一些额外的资源文件,视频啊,图片啊.这些需要打包在一个安装文 ...

  6. 用html5文件api实现移动端图片上传&预览效果

    想要用h5在移动端实现图片上传&预览效果,首先要了解html5的文件api相关知识(所有api只列举本功能所需): 1.Blob对象  Blob表示原始二进制数据,Html5的file对象就继 ...

  7. putty的基本使用

    1.输入你要连接的目标的IP地址,输入你要给它取的名字,点击保存 2.选中你保存的会话,点击打开,即可打开会话 3.输入你连接的目标的用户账号,回车,再输入密码.即可正常使用. 4.编码的设置 在出现 ...

  8. 拼多多2018校招编程题汇总 Python实现

    题目原址 列表补全 在商城的某个位置有一个商品列表,该列表是由L1.L2两个子列表拼接而成.当用户浏览并翻页时,需要从列表L1.L2中获取商品进行展示.展示规则如下: 用户可以进行多次翻页,用offs ...

  9. [oldboy-django][6其他]微信二维码扫码登录注册

    http://blog.csdn.net/maerdym/article/details/46380309 http://blog.csdn.net/jiang1013nan/article/deta ...

  10. docker log 批量删除报错: find: `/var/lib/docker/containers/': 没有那个文件或目录

    问题描述: 服务器上面docker log太多,打算用之前写的批量清理shell脚本清理掉,但是发现报错. find: `/var/lib/docker/containers/': 没有那个文件或目录 ...