給定兩個日期,計算這兩個日期之間有多少個2月29日(包括起始日期)。
只有閏年有2月29日,滿足以下乙個條件的年份為閏年:
1. 年份能被4整除但不能被100整除
2. 年份能被400整除
第一行為乙個整數t,表示資料組數。
之後每組資料報含兩行。每一行格式為"month day, year",表示乙個日期。month為中的乙個字串。day與year為兩個數字。
資料保證給定的日期合法且第乙個日期早於或等於第二個日期。
對於每組資料輸出一行,形如"case #x: y"。x為資料組數,從1開始,y為答案。
1 ≤ t ≤ 550
小資料:
2000 ≤ year ≤ 3000
大資料:
2000 ≤ year ≤ 2×109
這道題由於資料量是1e9
所以用迴圈必死。
這裡我們用到了容斥的原理,之餘容斥是什麼,自己去腦補,我也是學長給我講了以後才知道的
由於我們需要(能被400整除和能被4但是不能被100整除的數),所以我們:能被4整除的數的個數+能被4整除的
-能被100整除的數的個數,這我們就算出了在年分a以前的閏年個數。
這裡由於我們只關心年分,所以我在之前把年分處理了一下
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//#define nn 110
#define inff 0x3fffffff
#define nn 20000007
#define maxx 2e9
#define ll long long
using namespace std;
char cc[20][10]=;
int main()
}for(i=0;i<12;i++)
}if(month1>=3)
if(month2==2)
}else if(month2<2)
a4=year1/4;
a400=year1/400;
a100=year1/100;
b4=year2/4;
b400=year2/400;
b100=year2/100;
ll g1=0,g2=0;
ll flag1=0,flag2=0;
if(year2%400==0||(year2%4==0&&year2%100!=0))
flag2=1;
if(year1%400==0||(year1%4==0&&year1%100!=0))
flag1=1;
if(year1==year2)
else
else if(flag1==1&&flag2==0)
else if(flag1==1&&flag2==1)
else if(flag1==0&&flag2==0)
}//printf("*** %lld %lld *****\n",year1,year2);
ll pp=0;
for(i=year1;i<=year2;i++)
// cntmon=cnt[0]+cnt[1]-cnt[2];
// printf("&&&&&&&& %lld\n",pp);
printf("case #%lld: %lld\n",i1,cntmon);}}
}
微軟程式設計之美2015 第一題
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 給定兩個日期,計算這兩個日期之間有多少個2月29 日 包括起始日期 只有閏年有2月29 1.年份能被 4整除但不能被 100整除 2.年份能被 400整除 第一行為乙個整數t 表示資料組數。之後每組資料報含兩行。每一行格式為 m...
程式設計之美2015初賽A
時間限制 2000ms 單點時限 1000ms 記憶體限制 256mb 兩個數a和 b a第一行為乙個數t,為資料組數。之後每組資料報含兩行。第一行為n,為集合s的大小。第二行為n個整數,表示集合內的數。對於每組資料輸出一行,形如 case x y x為資料編號,從1開始,y為最大的子集的大小。1 ...
程式設計之美題選
1 求二進位制數中1的個數 1 除以2 根據餘數 判斷,迭代 2 與1相與,根據結果判斷,迴圈移位 3 列出全部資料對映2 1 3 2 4 1 建立hash表o 1 4 1100 1011 1000 能去掉最右邊的1 intnumber int n 2 求出陣列中個數超過一半的數字a 每次刪除2個不...