#include <cmath>
#include <string>

typedef struct MyDate {
  int year;
  int month;
  int day;
} MyDate;

class Date {
 public:
  Date(int year, int month, int day) {
    MyDate dt;
    dt.year = year;
    dt.month = month;
    dt.day = day;
    this->date = dt;
    this->isLeap = this->YearIsLeap(year);

    char ch[12] = { '\0' };
    snprintf(ch, sizeof(ch), "%02d.%02d.%04d", dt.day, dt.month, dt.year);
    this->strFormat = {ch};
  }

  bool IsLeap() const {
    return this->isLeap;
  }
  std::string ToString() const {
    return this->strFormat;
  }
  Date DaysLater(int days) {
    int year = this->date.year,
      month = this->date.month,
      day = this->date.day + days;

    int amount = this->DaysAmount(month, year);
    while (day > amount) {
      day -= amount;
      if (++month > 12) {
        month = 1;
        year += 1;
      }
      amount = this->DaysAmount(month, year);
    }
    return Date(year, month, day);
  }
  int DaysLeft(const Date& date) {
    MyDate dt = this->date;
    int a = (14 - dt.month) / 12;
    int y = dt.year + 4800 - a;
    int m = dt.month + 12*a - 3;
    int fr = dt.day + (153*m + 2) / 5 + 365*y + y/4 - y/100 + y/400 - 32045;
    dt = date.GetDate();
    a = (14 - dt.month) / 12;
    y = dt.year + 4800 - a;
    m = dt.month + 12*a - 3;
    int sc = dt.day + (153*m + 2) / 5 + 365*y + y/4 - y/100 + y/400 - 32045;
    return abs(fr - sc);
  }
  MyDate GetDate() const { return this->date; }

 private:
  MyDate date;
  bool isLeap = true;
  std::string strFormat;

  int DaysAmount(int month, int year) {
    if (month < 8) {
      if (month == 2) {
        int res = 28;
        if (this->YearIsLeap(year)) res++;
        return res;
      }
      return 30 + (month % 2);
    }
    return 31 - (month % 2);
  }

  bool YearIsLeap(int year) {
    if (year % 4 != 0)
      return false;
    else if (year >= 100 && year % 100 == 0 && year % 400 != 0)
      return false;
    return true;
  }
};