#include <string>
#include <cstdint>
class Date {
public:
int y, m, d;
Date(int year, int month, int day);
bool IsLeap() const;
std::string ToString() const;
Date DaysLater(int days) const;
int DaysLeft(const Date& date) const;
void NextDay();
};
int md[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Date::Date(int year, int month, int day) {
y = year;
m = month;
d = day;
}
bool Date::IsLeap() const {
return (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0));
}
std::string Date::ToString() const {
std::string ans = "";
if (d < 10)
ans += "0";
ans += std::to_string(d) + ".";
if (m < 10)
ans += "0";
ans += std::to_string(m) + ".";
for (int i = y; i < 1000; i *= 10)
ans += "0";
ans += std::to_string(y);
return ans;
}
Date Date::DaysLater(int days) const {
Date ans(y, m, d);
for (int i = 0; i < days; i++)
ans.NextDay();
return ans;
}
int Date::DaysLeft(const Date& date) const {
Date ans(y, m, d);
int cnt = 0;
while (ans.d != date.d || ans.m != date.m || ans.y != date.y) {
ans.NextDay();
cnt++;
}
return cnt;
}
void Date::NextDay() {
d++;
if (d >= md[m] + 1) {
if ((m == 2 && IsLeap() && d == 30) || !(m == 2 && IsLeap())) {
d = 1;
m++;
}
}
if (m == 13) {
m = 1;
y++;
}
}