#include <stdio.h>
#define Sunday 0
#define Monday 1
#define Tuesday 2
#define Wednesday 3
#define Thursday 4
#define Friday 5
#define Saturday 6

int month = 1;
int year = 1900;

/* Function Prototypes*/

/*This function tells the user what to enter and other instructions*/
void GiveInstructions(void);

/*This function reads in a year and month from the user and stores that value. Note the year is 1900 or after. */


/*Prints Calendar for a given month and year */
void PrintCalendarMonth(int month, int year);

/*Returns the number of days in the indicated month and year*/
int MonthDays(int month, int year);

/*This function indicates the day of the week on which the indicated month begins. 
This program simply counts forward from January 1, 1900, which was a Monday.*/
int FirstDayofMonth(int month, int year);

/*This function returns 1 if the year is a leap year. */
int IsLeapYear(int year);

int main(void)
{
	GiveInstructions();

	scanf("%d",&month);
	scanf("%d",&year);
	PrintCalendarMonth(month,year);

	return 0;
}

void GiveInstructions(void)
{
	printf("Enter a month first and then a year after 1900.\n");
	printf("Use a number to indicate the month (Ex. January = 1, February = 2)\n");
}


void PrintCalendarMonth(int month, int year)
{
	int days_of_month = MonthDays(month,year);
	int first_day = FirstDayofMonth(month,year);
	int day_of_week = first_day;
	int i = 2;
	switch (month)
	{
		case 1:
			printf("January ");
			break;
		case 2:
			printf("February ");
			break;
		case 3:
			printf("March ");
			break;
		case 4:
			printf("April ");
			break;
		case 5:
			printf("May ");
			break;
		case 6:
			printf("June ");
			break;
		case 7:
			printf("July ");
			break;
		case 8:
			printf("August ");
			break;
		case 9:
			printf("September ");
			break;
		case 10:
			printf("October ");
			break;
		case 11:
			printf("November ");
			break;
		case 12:
			printf("December ");
			break;
	}
	printf("%d\n",year);
	printf("Su\tMo\tTu\tWe\tTh\tFr\tSa\n");
	switch (first_day)
	{
		case 0:
			printf("1\t");
			break;
		case 1:
			printf("\t1\t");
			break;
		case 2:
			printf("\t\t1\t");
			break;
		case 3:
			printf("\t\t\t1\t");
			break;
		case 4:
			printf("\t\t\t\t1\t");
			break;
		case 5:
			printf("\t\t\t\t\t1\t");
			break;
		case 6:
			printf("\t\t\t\t\t\t1\t");
			break;
	}
	while(i<days_of_month)
	{
		day_of_week = 0;
		while (day_of_week < 6)
		{
			printf("%d\t",i);
			i++;
			day_of_week++;
		}
		printf("\n");
	}	
}

int MonthDays(int month, int year)
{
	int leap_year = IsLeapYear(year);
		switch (month)
		{
			case 1: case 3: case 5: case 7: case 8: case 10: case 12:
				return 31;
				break;
			case 4: case 6: case 9: case 11:
				return 30;
				break;
			case 2:
				switch(leap_year)
				{
					case 0:
						return 28;
						break;
					case 1:
						return 29;
						break;
					default:
						return 0;
						break;
				}
			default:
				return 0;
				break;
		}
}

int FirstDayofMonth(int month, int year)
{
	int num_days = (year-1900)*365;
	int i;
	int leap_year;
	for (i = 1900; i < year; i++)
	{
		leap_year = IsLeapYear(i);
		if (leap_year == 1)
			num_days +=1;
	}
	switch (month)
	{
		
		case 2:
			num_days += 31;
			break;
		case 3:
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days +=60;
			else
				num_days += 59;
			break;
		case 4: 
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days += 91;
			else
				num_days += 90;
			break;
		case 5:
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days += 121;
			else
				num_days += 120;
			break;
		case 6:
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days += 152;
			else
				num_days += 151;
			break;
		case 7:
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days += 182;
			else
				num_days += 181;
			break;
		case 8:
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days += 213;
			else
				num_days += 212;
			break;
		case 9:
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days += 244;
			else
				num_days += 243;
			break;
		case 10:
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days += 274;
			else
				num_days += 273;
			break;
		case 11:
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days += 305;
			else
				num_days += 304;
			break;
		case 12:
			leap_year = IsLeapYear(year);
			if (leap_year == 1)
				num_days += 335;
			else
				num_days += 334;
			break;
	}
	int j;
	int day_of_week = 1;
	for (j=1; j <= num_days; j++)
	{
		day_of_week++;
		if (day_of_week == 7)
			day_of_week = 0;
	}
	return day_of_week;
}

int IsLeapYear(int year)
{
	if ((year % 4) == 0)
	{
		if ((year % 100) == 0)
		{
			if ((year % 400) == 0)
				return 1;
			else
				return 0;
		}
		else
			return 1;
	}
	else
		return 0;
}

