#include <bits/stdc++.h>
using namespace std;
int BSearch(int const *arr, int Num)
{
int low = 0, high = 11;
int mid = (low + high) / 2;
while (low <= high)
{
if (Num >= arr[mid] && Num < arr[mid + 1])
return mid;
else if (Num > arr[mid])
low = mid + 1;
else
high = mid - 1;
mid = (high + low) / 2;
}
return -1;
}
/**
* @brief 此处核心的思路是
* 将每个月之前过了多少天给计算出来
* 如果扣除本月之前的所有天数,就能得到几号
* 我们可以使用简单遍历,从左向右,逐个查找Num第一个大于等于此数组的位置
* 此处使用了折半查找
* @param Y 年数
* @param Num 今年第几天
* @param M 月数,引用
* @param D 天数,引用
*/
void IdentifyMandD(int Y, int Num, int &M, int &D)
{
int isRunNian = 0;
if ((!(Y % 4) && Y % 100) || !(Y % 400))
isRunNian = 1;
int BeforeThisMonth[12] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
if (isRunNian && Num > 60)
Num--;
M = BSearch(BeforeThisMonth, Num) + 1;
D = Num - BeforeThisMonth[M - 1];
}
void PrintYandMandD(int Y, int M, int D)
{
cout << Y << '-';
if (M >= 10)
cout << M;
else
cout << '0' << M;
if (D >= 10)
cout << '-' << D << endl;
else
cout << "-0" << D << endl;
} //此处注意'-0'是错误的,非常容易被忽视
int main()
{
int Y, Num;
int M, D;
while (cin >> Y >> Num)
{
IdentifyMandD(Y, Num, M, D);
PrintYandMandD(Y, M, D);
}
return 0;
}