#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构
typedef struct Node {
    int data;          // 节点存储的数字
    struct Node* next; // 指向后一个节点的指针
} Node;

// 创建新节点(动态分配内存,初始化数据)
Node* createNode(int num) {
    Node* newNode = (Node*)malloc(sizeof(Node)); // 分配节点内存
    newNode->data = num;                         // 存储数字
    newNode->next = NULL;                        // 初始化为空指针(尾节点标志)
    return newNode;
}

// 构建链表:生成 [1, N] 的所有数字节点,串联成链表
Node* buildLinkedList(int N) {
    Node* head = NULL; // 链表头指针(初始为空)
    Node* tail = NULL; // 链表尾指针(用于高效添加节点)

    for (int i = 1; i <= N; i++) {
        Node* newNode = createNode(i); // 创建当前数字的节点
        if (head == NULL) {            // 链表为空时,新节点作为头节点
            head = newNode;
            tail = newNode;
        } else {                       // 链表非空时,新节点添加到尾部
            tail->next = newNode;
            tail = newNode;
        }
    }
    return head; // 返回链表头(通过头指针可访问整个链表)
}

// 遍历链表,统计奇数和偶数个数
void countOddEven(Node* head, int* oddCount, int* evenCount) {
    Node* curr = head; // 遍历指针(从表头开始)
    *oddCount = 0;     // 初始化奇数计数
    *evenCount = 0;    // 初始化偶数计数

    while (curr != NULL) { // 遍历到尾节点(curr为NULL时结束)
        if (curr->data % 2 == 1) { // 判断当前节点数字是否为奇数
            (*oddCount)++;
        } else {
            (*evenCount)++;
        }
        curr = curr->next; // 指针后移,访问下一个节点
    }
}

// 释放链表内存(避免内存泄漏)
void freeLinkedList(Node* head) {
    Node* temp;
    while (head != NULL) {
        temp = head;       // 暂存当前节点
        head = head->next; // 头指针后移
        free(temp);        // 释放当前节点内存
    }
}

int main() {
    int N, odd, even;
    scanf("%d", &N);

    Node* head = buildLinkedList(N); // 构建链表
    countOddEven(head, &odd, &even); // 统计奇偶数

    printf("%d %d\n", odd, even);

    freeLinkedList(head); // 释放内存
    return 0;
}