Lucky and Good Months by Gregorian Calendar(poj 3393)
Posted Cola
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lucky and Good Months by Gregorian Calendar(poj 3393)相关的知识,希望对你有一定的参考价值。
大致题意:
科普文一篇,文章80%都是无用信息,因为都是常识,但是又不得不看,因为有20%是常人不知道的历史常识。
定义:
Goog month : 该月第一个工作日为星期一的月份
Luckly month: 该月最后一个工作日为星期五的月份
问: 给定一个Gregorian Calendar格里高公历的 时间闭区间(就是包括端点的年月了)
【开始年、月】~【结束年、月】
在这个时间区间内,有多少个Goog month,有多少个Luckly month
文章要点:
Gregorian Calendar格里高公历 就是现在广泛使用公历(西历),下面简称GC
GC的起始日期为 1年1月1号,该日为星期六
GC平年有365天,闰年366天(2月多1天)
GC有12个月,各月的天数和现在的使用的西历一致
GC在1582年之前(不包括1582),若该年份能被4整除,则为闰年
GC在1582年之后(包括1582),判断闰年的标准(满足下面随便一个):
(1) 能被4整除,但不能被100整除;
(2) 能被400整除。
由于历史原因,GC规定1700年无条件为闰年
由于历史原因,GC规定1752年9月3日~13日共11天不存在,即1752年9月只有19天
GC一星期有7天,排序为Sun,Mon,Tue,Wed,Thu,Fri,Sat,和现在的星期一致,其中Mon到Fri为工作日,Sun和Sat为休息日
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int mnum[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int rnum[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int nu52[13]={0,31,29,31,30,31,30,31,31,19,31,30,31}; int rr[10010],rr_b[10010],good[10010][13],lucky[10010][13]; int run(int x) { if(rr_b[x])return rr[x]; rr_b[x]=1; if(x<1582&&x%4==0)rr[x]=1; else if(x==1700)rr[x]=1; else if(x%400==0)rr[x]=1; else if(x%4==0&&x%100!=0)rr[x]=1; return rr[x]; } void work() { int day=5; for(int i=1;i<=10000;i++)//循环年份 { for(int j=1;j<=12;j++)//循环月份 { if(j==1)//一月和普通月的差别 { good[i][j]=good[i-1][12]; lucky[i][j]=lucky[i-1][12]; } else { lucky[i][j]=lucky[i][j-1]; good[i][j]=good[i][j-1]; } if(i==1752)//1752年 { int gd=(day+1)%7,ld=(day+nu52[j])%7; if(gd==1||gd==6||gd==0)good[i][j]+=1; if(ld==5||ld==6||ld==0)lucky[i][j]+=1; day=(day+nu52[j])%7; } else if(run(i))//普通闰年 { int gd=(day+1)%7,ld=(day+rnum[j])%7; if(gd==1||gd==6||gd==0)good[i][j]+=1; if(ld==5||ld==6||ld==0)lucky[i][j]+=1; day=(day+rnum[j])%7; } else//普通年 { int gd=(day+1)%7,ld=(day+mnum[j])%7; if(gd==1||gd==6||gd==0)good[i][j]+=1; if(ld==5||ld==6||ld==0)lucky[i][j]+=1; day=(day+mnum[j])%7; } } } } int main() { int x,xm,y,ym,T; work(); scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&x,&xm,&y,&ym); if(xm==1)printf("%d %d\\n",lucky[y][ym]-lucky[x-1][12],good[y][ym]-good[x-1][12]); else printf("%d %d\\n",lucky[y][ym]-lucky[x][xm-1],good[y][ym]-good[x][xm-1]); }//注意xm是一月份的时候 return 0; }
以上是关于Lucky and Good Months by Gregorian Calendar(poj 3393)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 899B Months and Years