# from collections import defaultdict
# import sys
# input = sys.stdin.readline
# N = int(input())
# dict = defaultdict(int)
# for i in range(N):
# dict[int(input())] += 1
# list = sorted([(key, val) for key, val in dict.items()], key=lambda x: (-x[1], x[0]))
# cnt = 0
# s_max = 0
# s_val = 0
# f_min = f_max = list[0][0]
# f_val = list[0][1]
# for num, fre in list:
# if cnt == 1:
# if s_val > fre:
# break
# s_max = max(s_max, abs(f_max - num))
# else:
# if f_val > fre:
# s_max = abs(f_max - num)
# s_val = fre
# cnt += 1
# continue
# f_min = min(f_min, num)
# f_max = max(f_max, num)
# if f_min != f_max:
# print(f_max - f_min)
# else:
# if s_val > -float('inf'):
# print(s_max)
# else:
# print(0)
# n = int(input())
# list = [list(map(int, input().split()))]
# list = list[0]
#
# q = int(input())
# q_list = [int(input()) for i in range(q)]
# start = 0
# end = n-1
# mid = 0
# for i in range(0, q):
# start = 0
# end = n-1
# mid = (start + end) // 2
# while start <= end:
# mid = (start + end) // 2
# if list[mid] == q_list[i]:
# print(list.index(q_list[i]) + 1)
# break
# elif list[mid] < q_list[i]:
# start = mid + 1
# else:
# end = mid - 1
# if start > end:
# print("-1")
# from math import sqrt
# n = int(input())
# data = []
# li = []
# for i in range(n):
# v = list(map(int, input().split()))
# data.append(v)
# data.sort(key=lambda x: x[0])
# print(data)
# for i in range((n-1)//2):
# li.append(sqrt((data[i][0] - data[i+1][0]) (data[i][0] - data[i+1][0]) + (data[i][1] - data[i+1][1]) (data[i][1] - data[i+1][1])))
# for i in range((n-1)//2):
# li.append(sqrt((data[i][0] - data[i+1][0]) (data[i][0] - data[i+1][0]) + (data[i][1] - data[i+1][1]) (data[i][1] - data[i+1][1])))
# # li.sort()
# # li[:] = (value for value in li if value != 0.0)
# # print(round(li[0], 1))
# import math
# import copy
#
#
# class Point():
# def init(self, x, y):
# self.x = x
# self.y = y
#
#
# def value(p1, p2):
# return math.sqrt((p1.x - p2.x) (p1.x - p2.x) + (p1.y - p2.y) (p1.y - p2.y))
#
#
# def Force(P, n):
# min_val = float('inf')
# for i in range(n):
# for j in range(i + 1, n):
# if value(P[i], P[j]) < min_val:
# min_val = value(P[i], P[j])
#
# return min_val
#
#
# def stripClosest(strip, size, d):
# min_val = d
#
# for i in range(size):
# j = i + 1
# while j < size and (strip[j].y - strip[i].y) < min_val:
# min_val = value(strip[i], strip[j])
# j += 1
#
# return min_val
#
#
# def closestUtil(P, Q, n):
# if n <= 3:
# return Force(P, n)
# mid = n // 2
# midPoint = P[mid]
# Pl = P[:mid]
# Pr = P[mid:]
# dl = closestUtil(Pl, Q, mid)
# dr = closestUtil(Pr, Q, n - mid)
#
# d = min(dl, dr)
#
# stripP = []
# stripQ = []
# lr = Pl + Pr
# for i in range(n):
# if abs(lr[i].x - midPoint.x) < d:
# stripP.append(lr[i])
# if abs(Q[i].x - midPoint.x) < d:
# stripQ.append(Q[i])
# stripP.sort(key=lambda point: point.y)
# min_a = min(d, stripClosest(stripP, len(stripP), d))
# min_b = min(d, stripClosest(stripQ, len(stripQ), d))
# return min(min_a, min_b)
#
#
# def closest(P, n):
# P.sort(key=lambda point: point.x)
# Q = copy.deepcopy(P)
# Q.sort(key=lambda point: point.y)
#
# return closestUtil(P, Q, n)
#
#
# data = []
# P = []
# n = int(input())
# for i in range(n):
# v = list(map(int, input().split()))
# data.append(v)
#
# for i in range(n):
# P.append(Point(data[i][0], data[i][1]))
# print(round(closest(P, n), 1))
from math import factorial
x = int(input())
num = 0
for i in range(x+1):
for j in range(i+1):
num += (((factorial(i)//factorial(i-j))//factorial(j)) * ((factorial(i)//factorial(i-j))//factorial(j))) % 99824353
print(i, j, num)
print(num % 99824353)
//#include<stdio.h>
//#include<string.h>
//int main()
//{
// int arr[100000] = {},i;
// while (scanf("%d", &arr[i]) != EOF)
// for(i=0;i<strlen(arr);i++)
// {
// printf("%d",arr[i]);
// }
//}
//#include <stdio.h>
//int n;
//int d[1002] = {};
//long long int abs(long long int a)
//{
// return a<0?-a:a;
//}
//int main()
//{
// scanf("%d",&n);
// int i,max_m=0,max_location,x=0,xl;
// for(i=0; i<n; i++)
// {
// int a;
// scanf("%d",&a);
// d[a]++;
// }
// for(i=0; i<n; i++)
// {
// if(max_m<=d[i])
// {
// max_m=d[i];
// max_location=i;
// xl=max_m;
// }
// else if(x<=d[i]&&d[i]!=0)
// {
// x=d[i];
// xl=i;
// }
// }
// int b;
// b=max_location-xl;
// printf("%d", abs(b));
// return 0;
//}
//#include<stdio.h>
//int main()
//{
// int arr[10] = {}, i,j;
// long long int sum =0;
// for(i=0;i<5;i++)
// {
// scanf("%d",&arr[i]);
// }
// for(i=0;i<5;i++)
// {
// for(j=1;j*j < arr[i];j++)
// {
// if(arr[i] % j == 0)
// {
// sum += j;
// sum += arr[i] / j;
// }
// }
// sum -= arr[i];
// if(sum == arr[i])
// {
// puts("yes");
// }
// else
// {
// puts("no");
// }
// sum = 0;
// }
//}
//#include<stdio.h>
//int main()
//{
// int n,m,i,j, k, arr[1000005] = {}, cnt = 0;
// scanf("%d", &n);
// for(i=0;i<n;i++)
// {
// scanf("%d",&arr[i]);
// }
// scanf("%d", &m);
// for(i=0;i<m;i++)
// {
// scanf("%d",&k);
// for(j=0;j<n;j++)
// {
// if(arr[j] == k)
// {
// printf("%d\n", j+1);
// cnt = 1;
// }
// }
// if(cnt == 0)
// {
// printf("-1\n");
// }
// cnt = 0;
// }
// return 0;
//}
//#include<stdio.h>
//int n,i = 0,j,cnt = 0, data[50] = {};
//int max = 0;
//int f(n)
//{
// if(n == 1)
// {
// data[i] += cnt;
// i++;
// return cnt;
// }
// if(n % 2 == 0)
// {
// cnt++;
// f(n/2);
// }
// if(n % 5 == 0)
// {
// cnt++;
// f(n/5);
// }
// else
// {
// n--;
// cnt++;
// f(n);
// }
//}
//int main()
//{
// scanf("%d",&n);
// f(n);
// printf("%d", cnt);
//}
//#include<stdio.h>
//int memo[1000000000] = {};
//unsigned long long int f(int n)
//{
// if(n == 2)
// {
// return 2;
// }
// if(n == 3)
// {
// return 2;
// }
// if(memo[n] != 0)
// {
// return memo[n];
// }
// memo[n] = f(n-1) + f(n-2);
// return memo[n];
//}
//int main()
//{
// int n;
// scanf("%d",&n);
// printf("%llu",f(n));
// return 0;
//}
//#include <stdio.h>
//#include<stdlib.h>
//unsigned long long int memo[105] = {};
//unsigned long long int fib(int n)
//{
// if (n <= 1)
// {
// return n;
// }
// if(memo[n])
// {
// return memo[n];
// }
// return memo[n] = fib(n - 1) + fib(n - 2);
//}
//int main()
//{
// int n;
// scanf("%d", &n);
// printf("%llu", fib(n+1));
//
// return 0;
//}