import java.util.HashSet;
import java.util.Arrays;
import java.util.List;
class MyClass {
public static void main
(String[] args
) { List
<Integer
> leapYears
= Arrays.
asList(1804,
1808,
1812,
1816,
1820,
1824,
1828,
1832,
1836,
1840,
1844,
1848,
1852,
1856,
1860,
1864,
1868,
1872,
1876,
1880,
1884,
1888,
1892,
1896,
1904,
1908,
1912,
1916,
1920,
1924,
1928,
1932,
1936,
1940,
1944,
1948,
1952,
1956,
1960,
1964,
1968,
1972,
1976,
1980,
1984,
1988,
1992,
1996,
2000,
2004,
2008,
2012,
2016,
2020,
2024,
2028,
2032,
2036,
2040,
2044,
2048,
2052,
2056,
2060,
2064,
2068,
2072,
2076,
2080,
2084,
2088,
2092,
2096,
2104,
2108,
2112,
2116,
2120,
2124,
2128,
2132,
2136,
2140,
2144,
2148,
2152,
2156,
2160,
2164,
2168,
2172,
2176,
2180,
2184,
2188,
2192,
2196,
2204,
2208,
2212,
2216,
2220,
2224,
2228,
2232,
2236,
2240,
2244,
2248,
2252,
2256,
2260,
2264,
2268,
2272,
2276,
2280,
2284,
2288,
2292,
2296,
2304,
2308,
2312,
2316,
2320,
2324,
2328,
2332,
2336,
2340,
2344,
2348,
2352,
2356,
2360,
2364,
2368,
2372,
2376,
2380,
2384,
2388,
2392,
2396,
2400); for(Integer year
= 1804; year
< 2400; year
++) { assert daysInMonth(month, year) == 31;
}
assert daysInMonth(month, year) == 30;
}
if(leapYears.contains(year)) {
assert daysInMonth(2, year) == 29;
}
else {
assert daysInMonth(2, year) == 28;
}
}
}
public static int daysInMonth(int m, int y) {
HashSet
<Integer
> monthsWith31Days
= new HashSet
<Integer
>(Arrays.
asList(1,
3,
5,
7,
8,
10,
12)); HashSet
<Integer
> monthsWith30Days
= new HashSet
<Integer
>(Arrays.
asList(4,
6,
9,
11));
if(monthsWith31Days.contains(m)) {
return 31;
} else if(monthsWith30Days.contains(m)) {
return 30;
}
else if(isLeapYear(y)) {
return 29;
}
else {
return 28;
}
}
public static boolean isLeapYear(int year) {
if (year % 4 != 0) {
return false;
} else if (year % 400 == 0) {
return true;
} else if (year % 100 == 0) {
return false;
} else {
return true;
}
}
}
aW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwppbXBvcnQgamF2YS51dGlsLkFycmF5czsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKY2xhc3MgTXlDbGFzcyB7CgogIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKICAgIExpc3Q8SW50ZWdlcj4gbGVhcFllYXJzID0gQXJyYXlzLmFzTGlzdCgxODA0LCAxODA4LCAxODEyLCAxODE2LCAxODIwLCAxODI0LCAxODI4LCAxODMyLCAxODM2LCAxODQwLCAxODQ0LCAxODQ4LCAxODUyLCAxODU2LCAxODYwLCAxODY0LCAxODY4LCAxODcyLCAxODc2LCAxODgwLCAxODg0LCAxODg4LCAxODkyLCAxODk2LCAxOTA0LCAxOTA4LCAxOTEyLCAxOTE2LCAxOTIwLCAxOTI0LCAxOTI4LCAxOTMyLCAxOTM2LCAxOTQwLCAxOTQ0LCAxOTQ4LCAxOTUyLCAxOTU2LCAxOTYwLCAxOTY0LCAxOTY4LCAxOTcyLCAxOTc2LCAxOTgwLCAxOTg0LCAxOTg4LCAxOTkyLCAxOTk2LCAyMDAwLCAyMDA0LCAyMDA4LCAyMDEyLCAyMDE2LCAyMDIwLCAyMDI0LCAyMDI4LCAyMDMyLCAyMDM2LCAyMDQwLCAyMDQ0LCAyMDQ4LCAyMDUyLCAyMDU2LCAyMDYwLCAyMDY0LCAyMDY4LCAyMDcyLCAyMDc2LCAyMDgwLCAyMDg0LCAyMDg4LCAyMDkyLCAyMDk2LCAyMTA0LCAyMTA4LCAyMTEyLCAyMTE2LCAyMTIwLCAyMTI0LCAyMTI4LCAyMTMyLCAyMTM2LCAyMTQwLCAyMTQ0LCAyMTQ4LCAyMTUyLCAyMTU2LCAyMTYwLCAyMTY0LCAyMTY4LCAyMTcyLCAyMTc2LCAyMTgwLCAyMTg0LCAyMTg4LCAyMTkyLCAyMTk2LCAyMjA0LCAyMjA4LCAyMjEyLCAyMjE2LCAyMjIwLCAyMjI0LCAyMjI4LCAyMjMyLCAyMjM2LCAyMjQwLCAyMjQ0LCAyMjQ4LCAyMjUyLCAyMjU2LCAyMjYwLCAyMjY0LCAyMjY4LCAyMjcyLCAyMjc2LCAyMjgwLCAyMjg0LCAyMjg4LCAyMjkyLCAyMjk2LCAyMzA0LCAyMzA4LCAyMzEyLCAyMzE2LCAyMzIwLCAyMzI0LCAyMzI4LCAyMzMyLCAyMzM2LCAyMzQwLCAyMzQ0LCAyMzQ4LCAyMzUyLCAyMzU2LCAyMzYwLCAyMzY0LCAyMzY4LCAyMzcyLCAyMzc2LCAyMzgwLCAyMzg0LCAyMzg4LCAyMzkyLCAyMzk2LCAyNDAwKTsKICAgIGZvcihJbnRlZ2VyIHllYXIgPSAxODA0OyB5ZWFyIDwgMjQwMDsgeWVhcisrKSB7CiAgICAgIGZvcihJbnRlZ2VyIG1vbnRoIDogQXJyYXlzLmFzTGlzdCgxLDMsNSw3LDgsMTAsMTIpKSB7CiAgICAgICAgYXNzZXJ0IGRheXNJbk1vbnRoKG1vbnRoLCB5ZWFyKSA9PSAzMTsKICAgICAgfQogICAgICBmb3IoSW50ZWdlciBtb250aCA6IEFycmF5cy5hc0xpc3QoNCw2LDksMTEpKSB7CiAgICAgICAgYXNzZXJ0IGRheXNJbk1vbnRoKG1vbnRoLCB5ZWFyKSA9PSAzMDsKICAgICAgfQogICAgICBpZihsZWFwWWVhcnMuY29udGFpbnMoeWVhcikpIHsKICAgICAgICBhc3NlcnQgZGF5c0luTW9udGgoMiwgeWVhcikgPT0gMjk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgYXNzZXJ0IGRheXNJbk1vbnRoKDIsIHllYXIpID09IDI4OwogICAgICB9CiAgICB9CiAgfQoKICBwdWJsaWMgc3RhdGljIGludCBkYXlzSW5Nb250aChpbnQgbSwgaW50IHkpIHsKICAgIEhhc2hTZXQ8SW50ZWdlcj4gbW9udGhzV2l0aDMxRGF5cyA9IG5ldyBIYXNoU2V0PEludGVnZXI+KEFycmF5cy5hc0xpc3QoMSwzLDUsNyw4LDEwLDEyKSk7CiAgICBIYXNoU2V0PEludGVnZXI+IG1vbnRoc1dpdGgzMERheXMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPihBcnJheXMuYXNMaXN0KDQsNiw5LDExKSk7CgogICAgaWYobW9udGhzV2l0aDMxRGF5cy5jb250YWlucyhtKSkgewogICAgICByZXR1cm4gMzE7CiAgICB9IGVsc2UgaWYobW9udGhzV2l0aDMwRGF5cy5jb250YWlucyhtKSkgewogICAgICByZXR1cm4gMzA7CiAgICB9CiAgICBlbHNlIGlmKGlzTGVhcFllYXIoeSkpIHsKICAgICAgcmV0dXJuIDI5OwogICAgfQogICAgZWxzZSB7CiAgICAgIHJldHVybiAyODsKICAgIH0KICB9CgogIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlYXBZZWFyKGludCB5ZWFyKSB7CiAgICBpZiAoeWVhciAlIDQgIT0gMCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9IGVsc2UgaWYgKHllYXIgJSA0MDAgPT0gMCkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSBpZiAoeWVhciAlIDEwMCA9PSAwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KfQo=