1long long __year_to_secs(long long year, int* is_leap) {
2    if (year - 2ULL <= 136) {
3        int y = year;
4        int leaps = (y - 68) >> 2;
5        if (!((y - 68) & 3)) {
6            leaps--;
7            if (is_leap)
8                *is_leap = 1;
9        } else if (is_leap)
10            *is_leap = 0;
11        return 31536000 * (y - 70) + 86400 * leaps;
12    }
13
14    int cycles, centuries, leaps, rem;
15
16    if (!is_leap)
17        is_leap = &(int){0};
18    cycles = (year - 100) / 400;
19    rem = (year - 100) % 400;
20    if (rem < 0) {
21        cycles--;
22        rem += 400;
23    }
24    if (!rem) {
25        *is_leap = 1;
26        centuries = 0;
27        leaps = 0;
28    } else {
29        if (rem >= 200) {
30            if (rem >= 300)
31                centuries = 3, rem -= 300;
32            else
33                centuries = 2, rem -= 200;
34        } else {
35            if (rem >= 100)
36                centuries = 1, rem -= 100;
37            else
38                centuries = 0;
39        }
40        if (!rem) {
41            *is_leap = 0;
42            leaps = 0;
43        } else {
44            leaps = rem / 4U;
45            rem %= 4U;
46            *is_leap = !rem;
47        }
48    }
49
50    leaps += 97 * cycles + 24 * centuries - *is_leap;
51
52    return (year - 100) * 31536000LL + leaps * 86400LL + 946684800 + 86400;
53}
54