#include <bits/stdc++.h>
using namespace std;
// ASSUMPTIONS
//
// - I use the definition of perfect month that's on its wikipedia which states that
// it's gotta be in Feb, in non leap year, and the 1st feb starts on either sunday or monday
// depends on each person's first day on their own calendar
//
// - I made an assumption that the date input from user will always be the first of january of that year
// which means, if a user put 2026 as the input, I'll assume it's the 1st January of 2026
// making the next perfect month will be 02-2026 and the prev one will be 2015-02 (if we use sunday)
int firstDayOfCalendar = 0; // default = sunday
// sakamoto algo's to find the day of the week of a certain date
int getDayOfTheWeek(int y, int m, int d){
int t[] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 };
if(m < 3){
y -= 1;
}
// sunday: 0 ; monday: 1 ; and so on ...
return ((y + y / 4 - y / 100 + y / 400 + t[m - 1] + d) % 7);
}
bool isLeapYear(int year){
return(((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));
}
void nearestPerfectMonth(int year){
int prev = -1;
int next = -1;
bool foundPrev = false;
bool foundNext = false;
int i = 0;
while(!(foundPrev && foundNext)){
if(!foundPrev && !isLeapYear(year - i -1) && getDayOfTheWeek((year - i -1), 2, 1) == firstDayOfCalendar){
prev = year - i -1;
foundPrev =true;
}
if(!foundNext && !isLeapYear(year + i) && getDayOfTheWeek((year + i), 2, 1) == firstDayOfCalendar){
next = year + i;
foundNext = true;
}
i++;
}
cout << "> { prev: \"" << prev << "-02\", next: \"" << next << "-02\" }";
}
int main(){
int year;
string firstDay;
cout << "Enter the first day on your calendar (monday/sunday): ";
cin >> firstDay;
transform(firstDay.begin(), firstDay.end(), firstDay.begin(), ::tolower);
if(firstDay == "monday"){
firstDayOfCalendar = 1;
}
else if(firstDay == "sunday"){
firstDayOfCalendar = 0;
}
else{
cerr << "invalid first day of calendar, defaulted into sunday\n";
}
cout << "Enter the year: ";
cin >> year;
nearestPerfectMonth(year);
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBBU1NVTVBUSU9OUwovLyAKLy8gLSBJIHVzZSB0aGUgZGVmaW5pdGlvbiBvZiBwZXJmZWN0IG1vbnRoIHRoYXQncyBvbiBpdHMgd2lraXBlZGlhIHdoaWNoIHN0YXRlcyB0aGF0Ci8vICAgaXQncyBnb3R0YSBiZSBpbiBGZWIsIGluIG5vbiBsZWFwIHllYXIsIGFuZCB0aGUgMXN0IGZlYiBzdGFydHMgb24gZWl0aGVyIHN1bmRheSBvciBtb25kYXkKLy8gICBkZXBlbmRzIG9uIGVhY2ggcGVyc29uJ3MgZmlyc3QgZGF5IG9uIHRoZWlyIG93biBjYWxlbmRhcgovLyAKLy8gLSBJIG1hZGUgYW4gYXNzdW1wdGlvbiB0aGF0IHRoZSBkYXRlIGlucHV0IGZyb20gdXNlciB3aWxsIGFsd2F5cyBiZSB0aGUgZmlyc3Qgb2YgamFudWFyeSBvZiB0aGF0IHllYXIKLy8gICB3aGljaCBtZWFucywgaWYgYSB1c2VyIHB1dCAyMDI2IGFzIHRoZSBpbnB1dCwgSSdsbCBhc3N1bWUgaXQncyB0aGUgMXN0IEphbnVhcnkgb2YgMjAyNgovLyAgIG1ha2luZyB0aGUgbmV4dCBwZXJmZWN0IG1vbnRoIHdpbGwgYmUgMDItMjAyNiBhbmQgdGhlIHByZXYgb25lIHdpbGwgYmUgMjAxNS0wMiAoaWYgd2UgdXNlIHN1bmRheSkKCmludCBmaXJzdERheU9mQ2FsZW5kYXIgPSAwOyAvLyBkZWZhdWx0ID0gc3VuZGF5CgovLyBzYWthbW90byBhbGdvJ3MgdG8gZmluZCB0aGUgZGF5IG9mIHRoZSB3ZWVrIG9mIGEgY2VydGFpbiBkYXRlCmludCBnZXREYXlPZlRoZVdlZWsoaW50IHksIGludCBtLCBpbnQgZCl7CgogICAgaW50IHRbXSA9IHsgMCwgMywgMiwgNSwgMCwgMywgNSwgMSwgNCwgNiwgMiwgNCB9OwoKICAgIGlmKG0gPCAzKXsKICAgICAgICB5IC09IDE7CiAgICB9CgogICAgLy8gc3VuZGF5OiAwIDsgbW9uZGF5OiAxIDsgYW5kIHNvIG9uIC4uLgogICAgcmV0dXJuICgoeSArIHkgLyA0IC0geSAvIDEwMCArIHkgLyA0MDAgKyB0W20gLSAxXSArIGQpICUgNyk7Cgp9Cgpib29sIGlzTGVhcFllYXIoaW50IHllYXIpewogICAgcmV0dXJuKCgoeWVhciAlIDQgPT0gMCkgJiYgKHllYXIgJSAxMDAgIT0gMCkpIHx8ICh5ZWFyICUgNDAwID09IDApKTsKfQoKdm9pZCBuZWFyZXN0UGVyZmVjdE1vbnRoKGludCB5ZWFyKXsKICAgIGludCBwcmV2ID0gLTE7CiAgICBpbnQgbmV4dCA9IC0xOwogICAgYm9vbCBmb3VuZFByZXYgPSBmYWxzZTsKICAgIGJvb2wgZm91bmROZXh0ID0gZmFsc2U7CiAgICBpbnQgaSA9IDA7CgogICAgd2hpbGUoIShmb3VuZFByZXYgJiYgZm91bmROZXh0KSl7CgogICAgICAgIGlmKCFmb3VuZFByZXYgJiYgIWlzTGVhcFllYXIoeWVhciAtIGkgLTEpICYmIGdldERheU9mVGhlV2VlaygoeWVhciAtIGkgLTEpLCAyLCAxKSA9PSBmaXJzdERheU9mQ2FsZW5kYXIpewogICAgICAgICAgICBwcmV2ID0geWVhciAtIGkgLTE7CiAgICAgICAgICAgIGZvdW5kUHJldiA9dHJ1ZTsKICAgICAgICB9CgogICAgICAgIGlmKCFmb3VuZE5leHQgJiYgIWlzTGVhcFllYXIoeWVhciArIGkpICYmIGdldERheU9mVGhlV2VlaygoeWVhciArIGkpLCAyLCAxKSA9PSBmaXJzdERheU9mQ2FsZW5kYXIpewogICAgICAgICAgICBuZXh0ID0geWVhciArIGk7CiAgICAgICAgICAgIGZvdW5kTmV4dCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICBpKys7CiAgICB9CgogICAgY291dCA8PCAiPiB7IHByZXY6IFwiIiA8PCBwcmV2IDw8ICItMDJcIiwgbmV4dDogXCIiIDw8IG5leHQgPDwgIi0wMlwiIH0iOwoKfQoKaW50IG1haW4oKXsKICAgIGludCB5ZWFyOwogICAgc3RyaW5nIGZpcnN0RGF5OwogICAgY291dCA8PCAiRW50ZXIgdGhlIGZpcnN0IGRheSBvbiB5b3VyIGNhbGVuZGFyIChtb25kYXkvc3VuZGF5KTogIjsKICAgIGNpbiA+PiBmaXJzdERheTsKICAgIHRyYW5zZm9ybShmaXJzdERheS5iZWdpbigpLCBmaXJzdERheS5lbmQoKSwgZmlyc3REYXkuYmVnaW4oKSwgOjp0b2xvd2VyKTsKICAgIGlmKGZpcnN0RGF5ID09ICJtb25kYXkiKXsKICAgICAgICBmaXJzdERheU9mQ2FsZW5kYXIgPSAxOwogICAgfQogICAgZWxzZSBpZihmaXJzdERheSA9PSAic3VuZGF5Iil7CiAgICAgICAgZmlyc3REYXlPZkNhbGVuZGFyID0gMDsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgY2VyciA8PCAiaW52YWxpZCBmaXJzdCBkYXkgb2YgY2FsZW5kYXIsIGRlZmF1bHRlZCBpbnRvIHN1bmRheVxuIjsKICAgIH0KCiAgICBjb3V0IDw8ICJFbnRlciB0aGUgeWVhcjogIjsKICAgIGNpbiA+PiB5ZWFyOwogICAgbmVhcmVzdFBlcmZlY3RNb250aCh5ZWFyKTsKCiAgICByZXR1cm4gMDsKfQ==