Given the following C code and unoptimized assembly code, your task is to generate highly optimized x86-64 assembly code.
C Code:

```c
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#include<inttypes.h>

typedef int32_t i32;
typedef int64_t i64;

const i32 mod = 998244353;

i32 mod_pow (i32 r, i32 n) {
  i32 t = 1;
  i32 s = r;
  while (n > 0) {
    if (n & 1) t = (i64) t * s % mod;
    s = (i64) s * s % mod;
    n >>= 1;
  }
  return t;
}

i32 inv (i32 a) {
  return mod_pow (a, mod - 2);
}

i32 *fact = NULL;
i32 *iFact = NULL;
void init_fact (const i32 n) {
  fact = (i32 *) calloc (n + 1, sizeof (i32));
  fact[0] = 1;
  for (i32 i = 1; i <= n; ++i) {
    fact[i] = (i64) i * fact[i - 1] % mod;
  }
  iFact = (i32 *) calloc (n + 1, sizeof (i32));
  iFact[n] = inv (fact[n]);
  for (i32 i = n - 1; i >= 0; --i) {
    iFact[i] = (i64) (i + 1) * iFact[i + 1] % mod;
  }
}

i32 comb (i32 n, i32 k) {
  if (!(0 <= k && k <= n)) return 0;
  return (i64) fact[n] * iFact[k] % mod * iFact[n - k] % mod;
}

void run (void) {
  i32 k, n;
  scanf ("%" SCNi32 "%" SCNi32, &k, &n);
  init_fact (n + k);
  for (i32 i = 2; i <= 2 * k; ++i) {
    i32 c = 0;
    for (i32 j = 1, l = i - 1; j <= l; ++j, --l) {
      c += j <= k && l <= k ? 1 : 0;
    }
    i32 ans = 0;
    for (i32 j = 0, p = 1; j <= c; ++j, p = 2 * p % mod) {
      i32 way = (i64) comb (c, j) * p % mod;
      ans = (ans + (i64) way * comb (n - j + (k - (2 * c - j)) - 1, n - j)) % mod;
    }
    printf ("%" PRIi32 "\n", ans);
  }
}

int main (void) {
  run();
  return 0;
}
```

Unoptimized Assembly Code:

```assembly
	.file	"temp.c"
	.text
	.globl	mod
	.section	.rodata
	.align 4
	.type	mod, @object
	.size	mod, 4
mod:
	.long	998244353
	.text
	.globl	mod_pow
	.type	mod_pow, @function
mod_pow:
.LFB6:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -20(%rbp)
	movl	%esi, -24(%rbp)
	movl	$1, -8(%rbp)
	movl	-20(%rbp), %eax
	movl	%eax, -4(%rbp)
	jmp	.L2
.L4:
	movl	-24(%rbp), %eax
	andl	$1, %eax
	testl	%eax, %eax
	je	.L3
	movl	-8(%rbp), %eax
	movslq	%eax, %rdx
	movl	-4(%rbp), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -8(%rbp)
.L3:
	movl	-4(%rbp), %eax
	movslq	%eax, %rdx
	movl	-4(%rbp), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -4(%rbp)
	sarl	-24(%rbp)
.L2:
	cmpl	$0, -24(%rbp)
	jg	.L4
	movl	-8(%rbp), %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE6:
	.size	mod_pow, .-mod_pow
	.globl	inv
	.type	inv, @function
inv:
.LFB7:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$8, %rsp
	movl	%edi, -4(%rbp)
	movl	$998244353, %eax
	leal	-2(%rax), %edx
	movl	-4(%rbp), %eax
	movl	%edx, %esi
	movl	%eax, %edi
	call	mod_pow
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE7:
	.size	inv, .-inv
	.globl	fact
	.bss
	.align 8
	.type	fact, @object
	.size	fact, 8
fact:
	.zero	8
	.globl	iFact
	.align 8
	.type	iFact, @object
	.size	iFact, 8
iFact:
	.zero	8
	.text
	.globl	init_fact
	.type	init_fact, @function
init_fact:
.LFB8:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	pushq	%rbx
	subq	$40, %rsp
	.cfi_offset 3, -24
	movl	%edi, -36(%rbp)
	movl	-36(%rbp), %eax
	addl	$1, %eax
	cltq
	movl	$4, %esi
	movq	%rax, %rdi
	call	calloc@PLT
	movq	%rax, fact(%rip)
	movq	fact(%rip), %rax
	movl	$1, (%rax)
	movl	$1, -24(%rbp)
	jmp	.L9
.L10:
	movl	-24(%rbp), %eax
	movslq	%eax, %rdx
	movq	fact(%rip), %rcx
	movl	-24(%rbp), %eax
	cltq
	salq	$2, %rax
	subq	$4, %rax
	addq	%rcx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rcx
	movq	fact(%rip), %rdx
	movl	-24(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	%ecx, %edx
	movl	%edx, (%rax)
	addl	$1, -24(%rbp)
.L9:
	movl	-24(%rbp), %eax
	cmpl	-36(%rbp), %eax
	jle	.L10
	movl	-36(%rbp), %eax
	addl	$1, %eax
	cltq
	movl	$4, %esi
	movq	%rax, %rdi
	call	calloc@PLT
	movq	%rax, iFact(%rip)
	movq	fact(%rip), %rdx
	movl	-36(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	(%rax), %eax
	movq	iFact(%rip), %rcx
	movl	-36(%rbp), %edx
	movslq	%edx, %rdx
	salq	$2, %rdx
	leaq	(%rcx,%rdx), %rbx
	movl	%eax, %edi
	call	inv
	movl	%eax, (%rbx)
	movl	-36(%rbp), %eax
	subl	$1, %eax
	movl	%eax, -20(%rbp)
	jmp	.L11
.L12:
	movl	-20(%rbp), %eax
	addl	$1, %eax
	movslq	%eax, %rdx
	movq	iFact(%rip), %rcx
	movl	-20(%rbp), %eax
	cltq
	addq	$1, %rax
	salq	$2, %rax
	addq	%rcx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rcx
	movq	iFact(%rip), %rdx
	movl	-20(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	%ecx, %edx
	movl	%edx, (%rax)
	subl	$1, -20(%rbp)
.L11:
	cmpl	$0, -20(%rbp)
	jns	.L12
	nop
	nop
	movq	-8(%rbp), %rbx
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE8:
	.size	init_fact, .-init_fact
	.globl	comb
	.type	comb, @function
comb:
.LFB9:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -4(%rbp)
	movl	%esi, -8(%rbp)
	cmpl	$0, -8(%rbp)
	js	.L14
	movl	-8(%rbp), %eax
	cmpl	-4(%rbp), %eax
	jle	.L15
.L14:
	movl	$0, %eax
	jmp	.L16
.L15:
	movq	fact(%rip), %rdx
	movl	-4(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	(%rax), %eax
	movslq	%eax, %rdx
	movq	iFact(%rip), %rcx
	movl	-8(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rcx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rcx
	movq	iFact(%rip), %rdx
	movl	-4(%rbp), %eax
	subl	-8(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rcx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
.L16:
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE9:
	.size	comb, .-comb
	.section	.rodata
.LC0:
	.string	"%i%i"
.LC1:
	.string	"%i\n"
	.text
	.globl	run
	.type	run, @function
run:
.LFB10:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	pushq	%r12
	pushq	%rbx
	subq	$48, %rsp
	.cfi_offset 12, -24
	.cfi_offset 3, -32
	movq	%fs:40, %rax
	movq	%rax, -24(%rbp)
	xorl	%eax, %eax
	leaq	-60(%rbp), %rdx
	leaq	-64(%rbp), %rax
	movq	%rax, %rsi
	leaq	.LC0(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	__isoc99_scanf@PLT
	movl	-60(%rbp), %edx
	movl	-64(%rbp), %eax
	addl	%edx, %eax
	movl	%eax, %edi
	call	init_fact
	movl	$2, -56(%rbp)
	jmp	.L18
.L25:
	movl	$0, -52(%rbp)
	movl	$1, -48(%rbp)
	movl	-56(%rbp), %eax
	subl	$1, %eax
	movl	%eax, -44(%rbp)
	jmp	.L19
.L22:
	movl	-64(%rbp), %eax
	cmpl	%eax, -48(%rbp)
	jg	.L20
	movl	-64(%rbp), %eax
	cmpl	%eax, -44(%rbp)
	jg	.L20
	movl	$1, %eax
	jmp	.L21
.L20:
	movl	$0, %eax
.L21:
	addl	%eax, -52(%rbp)
	addl	$1, -48(%rbp)
	subl	$1, -44(%rbp)
.L19:
	movl	-48(%rbp), %eax
	cmpl	-44(%rbp), %eax
	jle	.L22
	movl	$0, -40(%rbp)
	movl	$0, -36(%rbp)
	movl	$1, -32(%rbp)
	jmp	.L23
.L24:
	movl	-36(%rbp), %edx
	movl	-52(%rbp), %eax
	movl	%edx, %esi
	movl	%eax, %edi
	call	comb
	movslq	%eax, %rdx
	movl	-32(%rbp), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -28(%rbp)
	movl	-40(%rbp), %eax
	movslq	%eax, %r12
	movl	-28(%rbp), %eax
	movslq	%eax, %rbx
	movl	-60(%rbp), %eax
	subl	-36(%rbp), %eax
	movl	-60(%rbp), %edx
	movl	%edx, %esi
	subl	-36(%rbp), %esi
	movl	-64(%rbp), %edx
	movl	-52(%rbp), %ecx
	addl	%ecx, %ecx
	subl	-36(%rbp), %ecx
	subl	%ecx, %edx
	addl	%esi, %edx
	subl	$1, %edx
	movl	%eax, %esi
	movl	%edx, %edi
	call	comb
	cltq
	imulq	%rbx, %rax
	addq	%r12, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -40(%rbp)
	addl	$1, -36(%rbp)
	movl	-32(%rbp), %eax
	addl	%eax, %eax
	movl	$998244353, %ecx
	cltd
	idivl	%ecx
	movl	%edx, -32(%rbp)
.L23:
	movl	-36(%rbp), %eax
	cmpl	-52(%rbp), %eax
	jle	.L24
	movl	-40(%rbp), %eax
	movl	%eax, %esi
	leaq	.LC1(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	printf@PLT
	addl	$1, -56(%rbp)
.L18:
	movl	-64(%rbp), %eax
	addl	%eax, %eax
	cmpl	%eax, -56(%rbp)
	jle	.L25
	nop
	movq	-24(%rbp), %rax
	subq	%fs:40, %rax
	je	.L26
	call	__stack_chk_fail@PLT
.L26:
	addq	$48, %rsp
	popq	%rbx
	popq	%r12
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE10:
	.size	run, .-run
	.globl	main
	.type	main, @function
main:
.LFB11:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	call	run
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE11:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:
```

Only output the optimized assembly code. Do not include any other text. Do not write any comments in the assembly code. Wrap the assembly code in ```assembly``` tags.
user
	.file	"temp.c"
	.text
	.p2align 4
	.globl	mod_pow
	.type	mod_pow, @function
mod_pow:
.LFB39:
	.cfi_startproc
	endbr64
	movl	%esi, %ecx
	movl	$1, %esi
	testl	%ecx, %ecx
	jle	.L1
	movabsq	$155014655926305585, %r8
	.p2align 4,,10
	.p2align 3
.L4:
	movslq	%edi, %rdi
	testb	$1, %cl
	je	.L3
	movslq	%esi, %rsi
	imulq	%rdi, %rsi
	movq	%rsi, %rax
	imulq	%r8
	movq	%rsi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %esi
.L3:
	imulq	%rdi, %rdi
	movq	%rdi, %rax
	imulq	%r8
	movq	%rdi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %edi
	sarl	%ecx
	jne	.L4
.L1:
	movl	%esi, %eax
	ret
	.cfi_endproc
.LFE39:
	.size	mod_pow, .-mod_pow
	.p2align 4
	.globl	inv
	.type	inv, @function
inv:
.LFB40:
	.cfi_startproc
	endbr64
	movl	$30, %esi
	movl	$1, %r9d
	movl	$998244351, %ecx
	movabsq	$155014655926305585, %r8
	.p2align 4,,10
	.p2align 3
.L13:
	movslq	%edi, %rdi
	testb	$1, %cl
	je	.L12
	movslq	%r9d, %r9
	imulq	%rdi, %r9
	movq	%r9, %rax
	imulq	%r8
	movq	%r9, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %r9d
.L12:
	imulq	%rdi, %rdi
	sarl	%ecx
	movq	%rdi, %rax
	imulq	%r8
	movq	%rdi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %edi
	subl	$1, %esi
	jne	.L13
	movl	%r9d, %eax
	ret
	.cfi_endproc
.LFE40:
	.size	inv, .-inv
	.p2align 4
	.globl	init_fact
	.type	init_fact, @function
init_fact:
.LFB41:
	.cfi_startproc
	endbr64
	pushq	%r13
	.cfi_def_cfa_offset 16
	.cfi_offset 13, -16
	leal	1(%rdi), %r13d
	movl	$4, %esi
	pushq	%r12
	.cfi_def_cfa_offset 24
	.cfi_offset 12, -24
	movslq	%r13d, %r12
	pushq	%rbp
	.cfi_def_cfa_offset 32
	.cfi_offset 6, -32
	pushq	%rbx
	.cfi_def_cfa_offset 40
	.cfi_offset 3, -40
	movl	%edi, %ebx
	movq	%r12, %rdi
	subq	$8, %rsp
	.cfi_def_cfa_offset 48
	call	calloc@PLT
	movl	%r13d, %edi
	movl	$1, %esi
	movabsq	$155014655926305585, %r8
	movq	%rax, fact(%rip)
	movq	%rax, %rbp
	movl	$1, (%rax)
	movl	$1, %eax
	testl	%ebx, %ebx
	jle	.L22
	.p2align 4,,10
	.p2align 3
.L21:
	movslq	%eax, %rcx
	imulq	%rsi, %rcx
	movq	%rcx, %rax
	imulq	%r8
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	movl	%ecx, 0(%rbp,%rsi,4)
	addq	$1, %rsi
	movl	%ecx, %eax
	cmpq	%rsi, %rdi
	jne	.L21
.L22:
	movl	$4, %esi
	movq	%r12, %rdi
	call	calloc@PLT
	movslq	%ebx, %r8
	movl	$1, %edi
	movl	$30, %r10d
	movq	%rax, iFact(%rip)
	movl	0(%rbp,%r8,4), %ecx
	movq	%rax, %rsi
	leaq	(%rax,%r8,4), %rbp
	movabsq	$155014655926305585, %r11
	movl	$998244351, %r9d
	.p2align 4,,10
	.p2align 3
.L20:
	movslq	%ecx, %rcx
	testb	$1, %r9b
	je	.L23
	movslq	%edi, %rdi
	imulq	%rcx, %rdi
	movq	%rdi, %rax
	imulq	%r11
	movq	%rdi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %edi
.L23:
	imulq	%rcx, %rcx
	sarl	%r9d
	movq	%rcx, %rax
	imulq	%r11
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %ecx
	subl	$1, %r10d
	jne	.L20
	movl	%edi, 0(%rbp)
	subl	$1, %ebx
	js	.L18
	movabsq	$155014655926305585, %r10
	leaq	-1(%r8), %r9
	movl	%ebx, %ebx
	subq	%rbx, %r9
	.p2align 4,,10
	.p2align 3
.L25:
	movslq	%edi, %rcx
	imulq	%r8, %rcx
	movq	%rcx, %rax
	imulq	%r10
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	movl	%ecx, -4(%rsi,%r8,4)
	subq	$1, %r8
	movl	%ecx, %edi
	cmpq	%r9, %r8
	jne	.L25
.L18:
	addq	$8, %rsp
	.cfi_def_cfa_offset 40
	popq	%rbx
	.cfi_def_cfa_offset 32
	popq	%rbp
	.cfi_def_cfa_offset 24
	popq	%r12
	.cfi_def_cfa_offset 16
	popq	%r13
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE41:
	.size	init_fact, .-init_fact
	.p2align 4
	.globl	comb
	.type	comb, @function
comb:
.LFB42:
	.cfi_startproc
	endbr64
	testl	%esi, %esi
	js	.L38
	cmpl	%edi, %esi
	jg	.L38
	movq	fact(%rip), %rax
	movslq	%edi, %rdx
	subl	%esi, %edi
	movq	iFact(%rip), %r9
	movabsq	$155014655926305585, %r8
	movslq	%edi, %rdi
	movslq	(%rax,%rdx,4), %rcx
	movslq	%esi, %rax
	movslq	(%r9,%rax,4), %rax
	imulq	%rax, %rcx
	movq	%rcx, %rax
	imulq	%r8
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	movslq	(%r9,%rdi,4), %rax
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	imulq	%rax, %rcx
	movq	%rcx, %rax
	imulq	%r8
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	movl	%ecx, %eax
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %eax
	ret
	.p2align 4,,10
	.p2align 3
.L38:
	xorl	%eax, %eax
	ret
	.cfi_endproc
.LFE42:
	.size	comb, .-comb
	.section	.rodata.str1.1,"aMS",@progbits,1
.LC1:
	.string	"%i%i"
.LC4:
	.string	"%i\n"
	.text
	.p2align 4
	.globl	run
	.type	run, @function
run:
.LFB43:
	.cfi_startproc
	endbr64
	pushq	%r15
	.cfi_def_cfa_offset 16
	.cfi_offset 15, -16
	leaq	.LC1(%rip), %rdi
	pushq	%r14
	.cfi_def_cfa_offset 24
	.cfi_offset 14, -24
	pushq	%r13
	.cfi_def_cfa_offset 32
	.cfi_offset 13, -32
	pushq	%r12
	.cfi_def_cfa_offset 40
	.cfi_offset 12, -40
	pushq	%rbp
	.cfi_def_cfa_offset 48
	.cfi_offset 6, -48
	pushq	%rbx
	.cfi_def_cfa_offset 56
	.cfi_offset 3, -56
	subq	$56, %rsp
	.cfi_def_cfa_offset 112
	movq	%fs:40, %rax
	movq	%rax, 40(%rsp)
	xorl	%eax, %eax
	leaq	36(%rsp), %rdx
	leaq	32(%rsp), %rsi
	call	__isoc99_scanf@PLT
	movl	32(%rsp), %edi
	addl	36(%rsp), %edi
	call	init_fact
	movl	32(%rsp), %r9d
	movl	$0, 24(%rsp)
	leal	(%r9,%r9), %eax
	cmpl	$1, %eax
	jle	.L39
	movdqa	.LC2(%rip), %xmm7
	movdqa	.LC3(%rip), %xmm6
	movabsq	$155014655926305585, %r15
	.p2align 4,,10
	.p2align 3
.L40:
	movl	24(%rsp), %ebx
	movl	%ebx, %edi
	movl	%ebx, 28(%rsp)
	addl	$1, %ebx
	movl	%edi, %ecx
	movl	%ebx, 24(%rsp)
	movl	%ebx, %eax
	shrl	%ecx
	addl	$1, %ecx
	cmpl	$9, %edi
	jbe	.L51
	leal	-1(%rdi), %eax
	movd	%edi, %xmm3
	movd	%ebx, %xmm2
	movl	%ecx, %edx
	movd	%eax, %xmm0
	leal	-2(%rdi), %eax
	punpckldq	%xmm3, %xmm2
	shrl	$2, %edx
	movd	%eax, %xmm4
	pxor	%xmm3, %xmm3
	xorl	%eax, %eax
	punpckldq	%xmm4, %xmm0
	movd	%r9d, %xmm4
	movdqa	%xmm3, %xmm8
	pshufd	$0, %xmm4, %xmm9
	movdqa	.LC0(%rip), %xmm4
	punpcklqdq	%xmm0, %xmm2
	.p2align 4,,10
	.p2align 3
.L42:
	movdqa	%xmm2, %xmm1
	movdqa	%xmm4, %xmm5
	paddd	%xmm7, %xmm2
	addl	$1, %eax
	movdqa	%xmm1, %xmm0
	paddd	%xmm6, %xmm4
	pcmpgtd	%xmm5, %xmm0
	pand	%xmm0, %xmm1
	pandn	%xmm5, %xmm0
	por	%xmm1, %xmm0
	pcmpgtd	%xmm9, %xmm0
	pcmpeqd	%xmm8, %xmm0
	psubd	%xmm0, %xmm3
	cmpl	%edx, %eax
	jne	.L42
	movdqa	%xmm3, %xmm0
	movl	24(%rsp), %eax
	movl	%ecx, %esi
	psrldq	$8, %xmm0
	andl	$-4, %esi
	paddd	%xmm0, %xmm3
	leal	1(%rsi), %edx
	subl	%esi, %eax
	movdqa	%xmm3, %xmm0
	psrldq	$4, %xmm0
	paddd	%xmm0, %xmm3
	movd	%xmm3, %ebp
	cmpl	%esi, %ecx
	je	.L43
.L41:
	cmpl	%edx, %eax
	movl	%edx, %ecx
	leal	-1(%rax), %esi
	cmovge	%eax, %ecx
	cmpl	%ecx, %r9d
	setge	%cl
	movzbl	%cl, %ecx
	addl	%ecx, %ebp
	leal	1(%rdx), %ecx
	cmpl	%esi, %ecx
	jg	.L43
	cmovl	%esi, %ecx
	leal	2(%rdx), %esi
	cmpl	%ecx, %r9d
	setge	%cl
	movzbl	%cl, %ecx
	addl	%ecx, %ebp
	leal	-2(%rax), %ecx
	cmpl	%esi, %ecx
	jl	.L43
	cmovl	%esi, %ecx
	leal	3(%rdx), %esi
	cmpl	%ecx, %r9d
	setge	%cl
	movzbl	%cl, %ecx
	addl	%ecx, %ebp
	leal	-3(%rax), %ecx
	cmpl	%esi, %ecx
	jl	.L43
	cmovl	%esi, %ecx
	cmpl	%ecx, %r9d
	setge	%cl
	addl	$4, %edx
	subl	$4, %eax
	movzbl	%cl, %ecx
	addl	%ecx, %ebp
	cmpl	%edx, %eax
	jl	.L43
	cmovl	%edx, %eax
	cmpl	%eax, %r9d
	setge	%al
	movzbl	%al, %eax
	addl	%eax, %ebp
.L43:
	movq	fact(%rip), %r14
	movslq	%ebp, %rax
	leal	(%rbp,%rbp), %edx
	xorl	%esi, %esi
	movslq	36(%rsp), %rcx
	subl	%edx, %r9d
	xorl	%r10d, %r10d
	movl	$1, %edi
	movslq	(%r14,%rax,4), %rbx
	movq	iFact(%rip), %r12
	xorl	%r13d, %r13d
	movq	%rcx, %r8
	subq	%rax, %rcx
	movq	%rbx, 8(%rsp)
	leaq	(%r12,%rax,4), %r11
	movq	%rcx, 16(%rsp)
	.p2align 4,,10
	.p2align 3
.L47:
	movslq	(%r12,%r10,4), %rcx
	movslq	(%r11), %rbx
	leal	-1(%r8,%r9), %eax
	testl	%r8d, %r8d
	js	.L44
	cmpl	%eax, %r8d
	jg	.L44
	cltq
	imulq	8(%rsp), %rcx
	movslq	(%r14,%rax,4), %rsi
	movq	16(%rsp), %rax
	movslq	(%r11,%rax,4), %rax
	imulq	%rax, %rsi
	movq	%rsi, %rax
	imulq	%r15
	movq	%rsi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	leal	-1(%r9), %eax
	imulq	$998244353, %rdx, %rdx
	cltq
	movslq	(%r12,%rax,4), %rax
	subq	%rdx, %rsi
	imulq	%rax, %rsi
	movq	%rsi, %rax
	imulq	%r15
	movq	%rsi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	movq	%rcx, %rax
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rsi
	imulq	%r15
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	imulq	%rbx, %rcx
	movq	%rcx, %rax
	imulq	%r15
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	movslq	%edi, %rax
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	imulq	%rax, %rcx
	movq	%rcx, %rax
	imulq	%r15
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	addq	$1, %r10
	subq	$4, %r11
	subl	$1, %r8d
	imulq	$998244353, %rdx, %rdx
	addl	$1, %r9d
	subq	%rdx, %rcx
	imulq	%rcx, %rsi
	addq	%r13, %rsi
	movq	%rsi, %rax
	imulq	%r15
	movq	%rsi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	leal	(%rdi,%rdi), %eax
	movslq	%eax, %rdi
	imulq	$998244353, %rdx, %rdx
	imulq	$288737297, %rdi, %rdi
	subl	%edx, %esi
	cltd
	sarq	$58, %rdi
	subl	%edx, %edi
	imull	$998244353, %edi, %edx
	subl	%edx, %eax
	movl	%eax, %edi
	cmpl	%r10d, %ebp
	jl	.L46
	movslq	%esi, %r13
	jmp	.L47
	.p2align 4,,10
	.p2align 3
.L44:
	leal	(%rdi,%rdi), %eax
	addq	$1, %r10
	subq	$4, %r11
	subl	$1, %r8d
	movslq	%eax, %rdi
	cltd
	addl	$1, %r9d
	imulq	$288737297, %rdi, %rdi
	sarq	$58, %rdi
	subl	%edx, %edi
	imull	$998244353, %edi, %edx
	subl	%edx, %eax
	movl	%eax, %edi
	cmpl	%r10d, %ebp
	jge	.L47
.L46:
	movl	%esi, %edx
	xorl	%eax, %eax
	leaq	.LC4(%rip), %rsi
	movl	$1, %edi
	call	__printf_chk@PLT
	movl	32(%rsp), %r9d
	movl	28(%rsp), %eax
	movdqa	.LC2(%rip), %xmm7
	movdqa	.LC3(%rip), %xmm6
	leal	(%r9,%r9), %edx
	addl	$3, %eax
	cmpl	%eax, %edx
	jge	.L40
.L39:
	movq	40(%rsp), %rax
	subq	%fs:40, %rax
	jne	.L57
	addq	$56, %rsp
	.cfi_remember_state
	.cfi_def_cfa_offset 56
	popq	%rbx
	.cfi_def_cfa_offset 48
	popq	%rbp
	.cfi_def_cfa_offset 40
	popq	%r12
	.cfi_def_cfa_offset 32
	popq	%r13
	.cfi_def_cfa_offset 24
	popq	%r14
	.cfi_def_cfa_offset 16
	popq	%r15
	.cfi_def_cfa_offset 8
	ret
	.p2align 4,,10
	.p2align 3
.L51:
	.cfi_restore_state
	movl	$1, %edx
	xorl	%ebp, %ebp
	jmp	.L41
.L57:
	call	__stack_chk_fail@PLT
	.cfi_endproc
.LFE43:
	.size	run, .-run
	.section	.text.startup,"ax",@progbits
	.p2align 4
	.globl	main
	.type	main, @function
main:
.LFB44:
	.cfi_startproc
	endbr64
	subq	$8, %rsp
	.cfi_def_cfa_offset 16
	call	run
	xorl	%eax, %eax
	addq	$8, %rsp
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE44:
	.size	main, .-main
	.globl	iFact
	.bss
	.align 8
	.type	iFact, @object
	.size	iFact, 8
iFact:
	.zero	8
	.globl	fact
	.align 8
	.type	fact, @object
	.size	fact, 8
fact:
	.zero	8
	.globl	mod
	.section	.rodata
	.align 4
	.type	mod, @object
	.size	mod, 4
mod:
	.long	998244353
	.section	.rodata.cst16,"aM",@progbits,16
	.align 16
.LC0:
	.long	1
	.long	2
	.long	3
	.long	4
	.align 16
.LC2:
	.long	-4
	.long	-4
	.long	-4
	.long	-4
	.align 16
.LC3:
	.long	4
	.long	4
	.long	4
	.long	4
	.ident	"GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:

rule
	.file	"temp.c"
	.text
	.p2align 4
	.globl	mod_pow
	.type	mod_pow, @function
mod_pow:
.LFB39:
	.cfi_startproc
	endbr64
	movl	%esi, %ecx
	movl	$1, %esi
	testl	%ecx, %ecx
	jle	.L1
	movabsq	$155014655926305585, %r8
	.p2align 4,,10
	.p2align 3
.L4:
	movslq	%edi, %rdi
	testb	$1, %cl
	je	.L3
	movslq	%esi, %rsi
	imulq	%rdi, %rsi
	movq	%rsi, %rax
	imulq	%r8
	movq	%rsi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %esi
.L3:
	imulq	%rdi, %rdi
	movq	%rdi, %rax
	imulq	%r8
	movq	%rdi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %edi
	sarl	%ecx
	jne	.L4
.L1:
	movl	%esi, %eax
	ret
	.cfi_endproc
.LFE39:
	.size	mod_pow, .-mod_pow
	.p2align 4
	.globl	inv
	.type	inv, @function
inv:
.LFB40:
	.cfi_startproc
	endbr64
	movl	$30, %esi
	movl	$1, %r9d
	movl	$998244351, %ecx
	movabsq	$155014655926305585, %r8
	.p2align 4,,10
	.p2align 3
.L13:
	movslq	%edi, %rdi
	testb	$1, %cl
	je	.L12
	movslq	%r9d, %r9
	imulq	%rdi, %r9
	movq	%r9, %rax
	imulq	%r8
	movq	%r9, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %r9d
.L12:
	imulq	%rdi, %rdi
	sarl	%ecx
	movq	%rdi, %rax
	imulq	%r8
	movq	%rdi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %edi
	subl	$1, %esi
	jne	.L13
	movl	%r9d, %eax
	ret
	.cfi_endproc
.LFE40:
	.size	inv, .-inv
	.p2align 4
	.globl	init_fact
	.type	init_fact, @function
init_fact:
.LFB41:
	.cfi_startproc
	endbr64
	pushq	%r13
	.cfi_def_cfa_offset 16
	.cfi_offset 13, -16
	leal	1(%rdi), %r13d
	movl	$4, %esi
	pushq	%r12
	.cfi_def_cfa_offset 24
	.cfi_offset 12, -24
	movslq	%r13d, %r12
	pushq	%rbp
	.cfi_def_cfa_offset 32
	.cfi_offset 6, -32
	pushq	%rbx
	.cfi_def_cfa_offset 40
	.cfi_offset 3, -40
	movl	%edi, %ebx
	movq	%r12, %rdi
	subq	$8, %rsp
	.cfi_def_cfa_offset 48
	call	calloc@PLT
	movl	%r13d, %edi
	movl	$1, %esi
	movabsq	$155014655926305585, %r8
	movq	%rax, fact(%rip)
	movq	%rax, %rbp
	movl	$1, (%rax)
	movl	$1, %eax
	testl	%ebx, %ebx
	jle	.L22
	.p2align 4,,10
	.p2align 3
.L21:
	movslq	%eax, %rcx
	imulq	%rsi, %rcx
	movq	%rcx, %rax
	imulq	%r8
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	movl	%ecx, 0(%rbp,%rsi,4)
	addq	$1, %rsi
	movl	%ecx, %eax
	cmpq	%rsi, %rdi
	jne	.L21
.L22:
	movl	$4, %esi
	movq	%r12, %rdi
	call	calloc@PLT
	movslq	%ebx, %r8
	movl	$1, %edi
	movl	$30, %r10d
	movq	%rax, iFact(%rip)
	movl	0(%rbp,%r8,4), %ecx
	movq	%rax, %rsi
	leaq	(%rax,%r8,4), %rbp
	movabsq	$155014655926305585, %r11
	movl	$998244351, %r9d
	.p2align 4,,10
	.p2align 3
.L20:
	movslq	%ecx, %rcx
	testb	$1, %r9b
	je	.L23
	movslq	%edi, %rdi
	imulq	%rcx, %rdi
	movq	%rdi, %rax
	imulq	%r11
	movq	%rdi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %edi
.L23:
	imulq	%rcx, %rcx
	sarl	%r9d
	movq	%rcx, %rax
	imulq	%r11
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %ecx
	subl	$1, %r10d
	jne	.L20
	movl	%edi, 0(%rbp)
	subl	$1, %ebx
	js	.L18
	movabsq	$155014655926305585, %r10
	leaq	-1(%r8), %r9
	movl	%ebx, %ebx
	subq	%rbx, %r9
	.p2align 4,,10
	.p2align 3
.L25:
	movslq	%edi, %rcx
	imulq	%r8, %rcx
	movq	%rcx, %rax
	imulq	%r10
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	movl	%ecx, -4(%rsi,%r8,4)
	subq	$1, %r8
	movl	%ecx, %edi
	cmpq	%r9, %r8
	jne	.L25
.L18:
	addq	$8, %rsp
	.cfi_def_cfa_offset 40
	popq	%rbx
	.cfi_def_cfa_offset 32
	popq	%rbp
	.cfi_def_cfa_offset 24
	popq	%r12
	.cfi_def_cfa_offset 16
	popq	%r13
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE41:
	.size	init_fact, .-init_fact
	.p2align 4
	.globl	comb
	.type	comb, @function
comb:
.LFB42:
	.cfi_startproc
	endbr64
	testl	%esi, %esi
	js	.L38
	cmpl	%edi, %esi
	jg	.L38
	movq	fact(%rip), %rax
	movslq	%edi, %rdx
	subl	%esi, %edi
	movq	iFact(%rip), %r9
	movabsq	$155014655926305585, %r8
	movslq	%edi, %rdi
	movslq	(%rax,%rdx,4), %rcx
	movslq	%esi, %rax
	movslq	(%r9,%rax,4), %rax
	imulq	%rax, %rcx
	movq	%rcx, %rax
	imulq	%r8
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	movslq	(%r9,%rdi,4), %rax
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	imulq	%rax, %rcx
	movq	%rcx, %rax
	imulq	%r8
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	movl	%ecx, %eax
	imulq	$998244353, %rdx, %rdx
	subl	%edx, %eax
	ret
	.p2align 4,,10
	.p2align 3
.L38:
	xorl	%eax, %eax
	ret
	.cfi_endproc
.LFE42:
	.size	comb, .-comb
	.section	.rodata.str1.1,"aMS",@progbits,1
.LC1:
	.string	"%i%i"
.LC4:
	.string	"%i\n"
	.text
	.p2align 4
	.globl	run
	.type	run, @function
run:
.LFB43:
	.cfi_startproc
	endbr64
	pushq	%r15
	.cfi_def_cfa_offset 16
	.cfi_offset 15, -16
	leaq	.LC1(%rip), %rdi
	pushq	%r14
	.cfi_def_cfa_offset 24
	.cfi_offset 14, -24
	pushq	%r13
	.cfi_def_cfa_offset 32
	.cfi_offset 13, -32
	pushq	%r12
	.cfi_def_cfa_offset 40
	.cfi_offset 12, -40
	pushq	%rbp
	.cfi_def_cfa_offset 48
	.cfi_offset 6, -48
	pushq	%rbx
	.cfi_def_cfa_offset 56
	.cfi_offset 3, -56
	subq	$56, %rsp
	.cfi_def_cfa_offset 112
	movq	%fs:40, %rax
	movq	%rax, 40(%rsp)
	xorl	%eax, %eax
	leaq	36(%rsp), %rdx
	leaq	32(%rsp), %rsi
	call	__isoc99_scanf@PLT
	movl	32(%rsp), %edi
	addl	36(%rsp), %edi
	call	init_fact
	movl	32(%rsp), %r9d
	movl	$0, 24(%rsp)
	leal	(%r9,%r9), %eax
	cmpl	$1, %eax
	jle	.L39
	movdqa	.LC2(%rip), %xmm7
	movdqa	.LC3(%rip), %xmm6
	movabsq	$155014655926305585, %r15
	.p2align 4,,10
	.p2align 3
.L40:
	movl	24(%rsp), %ebx
	movl	%ebx, %edi
	movl	%ebx, 28(%rsp)
	addl	$1, %ebx
	movl	%edi, %ecx
	movl	%ebx, 24(%rsp)
	movl	%ebx, %eax
	shrl	%ecx
	addl	$1, %ecx
	cmpl	$9, %edi
	jbe	.L51
	leal	-1(%rdi), %eax
	movd	%edi, %xmm3
	movd	%ebx, %xmm2
	movl	%ecx, %edx
	movd	%eax, %xmm0
	leal	-2(%rdi), %eax
	punpckldq	%xmm3, %xmm2
	shrl	$2, %edx
	movd	%eax, %xmm4
	pxor	%xmm3, %xmm3
	xorl	%eax, %eax
	punpckldq	%xmm4, %xmm0
	movd	%r9d, %xmm4
	movdqa	%xmm3, %xmm8
	pshufd	$0, %xmm4, %xmm9
	movdqa	.LC0(%rip), %xmm4
	punpcklqdq	%xmm0, %xmm2
	.p2align 4,,10
	.p2align 3
.L42:
	movdqa	%xmm2, %xmm1
	movdqa	%xmm4, %xmm5
	paddd	%xmm7, %xmm2
	addl	$1, %eax
	movdqa	%xmm1, %xmm0
	paddd	%xmm6, %xmm4
	pcmpgtd	%xmm5, %xmm0
	pand	%xmm0, %xmm1
	pandn	%xmm5, %xmm0
	por	%xmm1, %xmm0
	pcmpgtd	%xmm9, %xmm0
	pcmpeqd	%xmm8, %xmm0
	psubd	%xmm0, %xmm3
	cmpl	%edx, %eax
	jne	.L42
	movdqa	%xmm3, %xmm0
	movl	24(%rsp), %eax
	movl	%ecx, %esi
	psrldq	$8, %xmm0
	andl	$-4, %esi
	paddd	%xmm0, %xmm3
	leal	1(%rsi), %edx
	subl	%esi, %eax
	movdqa	%xmm3, %xmm0
	psrldq	$4, %xmm0
	paddd	%xmm0, %xmm3
	movd	%xmm3, %ebp
	cmpl	%esi, %ecx
	je	.L43
.L41:
	cmpl	%edx, %eax
	movl	%edx, %ecx
	leal	-1(%rax), %esi
	cmovge	%eax, %ecx
	cmpl	%ecx, %r9d
	setge	%cl
	movzbl	%cl, %ecx
	addl	%ecx, %ebp
	leal	1(%rdx), %ecx
	cmpl	%esi, %ecx
	jg	.L43
	cmovl	%esi, %ecx
	leal	2(%rdx), %esi
	cmpl	%ecx, %r9d
	setge	%cl
	movzbl	%cl, %ecx
	addl	%ecx, %ebp
	leal	-2(%rax), %ecx
	cmpl	%esi, %ecx
	jl	.L43
	cmovl	%esi, %ecx
	leal	3(%rdx), %esi
	cmpl	%ecx, %r9d
	setge	%cl
	movzbl	%cl, %ecx
	addl	%ecx, %ebp
	leal	-3(%rax), %ecx
	cmpl	%esi, %ecx
	jl	.L43
	cmovl	%esi, %ecx
	cmpl	%ecx, %r9d
	setge	%cl
	addl	$4, %edx
	subl	$4, %eax
	movzbl	%cl, %ecx
	addl	%ecx, %ebp
	cmpl	%edx, %eax
	jl	.L43
	cmovl	%edx, %eax
	cmpl	%eax, %r9d
	setge	%al
	movzbl	%al, %eax
	addl	%eax, %ebp
.L43:
	movq	fact(%rip), %r14
	movslq	%ebp, %rax
	leal	(%rbp,%rbp), %edx
	xorl	%esi, %esi
	movslq	36(%rsp), %rcx
	subl	%edx, %r9d
	xorl	%r10d, %r10d
	movl	$1, %edi
	movslq	(%r14,%rax,4), %rbx
	movq	iFact(%rip), %r12
	xorl	%r13d, %r13d
	movq	%rcx, %r8
	subq	%rax, %rcx
	movq	%rbx, 8(%rsp)
	leaq	(%r12,%rax,4), %r11
	movq	%rcx, 16(%rsp)
	.p2align 4,,10
	.p2align 3
.L47:
	movslq	(%r12,%r10,4), %rcx
	movslq	(%r11), %rbx
	leal	-1(%r8,%r9), %eax
	testl	%r8d, %r8d
	js	.L44
	cmpl	%eax, %r8d
	jg	.L44
	cltq
	imulq	8(%rsp), %rcx
	movslq	(%r14,%rax,4), %rsi
	movq	16(%rsp), %rax
	movslq	(%r11,%rax,4), %rax
	imulq	%rax, %rsi
	movq	%rsi, %rax
	imulq	%r15
	movq	%rsi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	leal	-1(%r9), %eax
	imulq	$998244353, %rdx, %rdx
	cltq
	movslq	(%r12,%rax,4), %rax
	subq	%rdx, %rsi
	imulq	%rax, %rsi
	movq	%rsi, %rax
	imulq	%r15
	movq	%rsi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	movq	%rcx, %rax
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rsi
	imulq	%r15
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	imulq	%rbx, %rcx
	movq	%rcx, %rax
	imulq	%r15
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	movslq	%edi, %rax
	imulq	$998244353, %rdx, %rdx
	subq	%rdx, %rcx
	imulq	%rax, %rcx
	movq	%rcx, %rax
	imulq	%r15
	movq	%rcx, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	addq	$1, %r10
	subq	$4, %r11
	subl	$1, %r8d
	imulq	$998244353, %rdx, %rdx
	addl	$1, %r9d
	subq	%rdx, %rcx
	imulq	%rcx, %rsi
	addq	%r13, %rsi
	movq	%rsi, %rax
	imulq	%r15
	movq	%rsi, %rax
	sarq	$63, %rax
	sarq	$23, %rdx
	subq	%rax, %rdx
	leal	(%rdi,%rdi), %eax
	movslq	%eax, %rdi
	imulq	$998244353, %rdx, %rdx
	imulq	$288737297, %rdi, %rdi
	subl	%edx, %esi
	cltd
	sarq	$58, %rdi
	subl	%edx, %edi
	imull	$998244353, %edi, %edx
	subl	%edx, %eax
	movl	%eax, %edi
	cmpl	%r10d, %ebp
	jl	.L46
	movslq	%esi, %r13
	jmp	.L47
	.p2align 4,,10
	.p2align 3
.L44:
	leal	(%rdi,%rdi), %eax
	addq	$1, %r10
	subq	$4, %r11
	subl	$1, %r8d
	movslq	%eax, %rdi
	cltd
	addl	$1, %r9d
	imulq	$288737297, %rdi, %rdi
	sarq	$58, %rdi
	subl	%edx, %edi
	imull	$998244353, %edi, %edx
	subl	%edx, %eax
	movl	%eax, %edi
	cmpl	%r10d, %ebp
	jge	.L47
.L46:
	movl	%esi, %edx
	xorl	%eax, %eax
	leaq	.LC4(%rip), %rsi
	movl	$1, %edi
	call	__printf_chk@PLT
	movl	32(%rsp), %r9d
	movl	28(%rsp), %eax
	movdqa	.LC2(%rip), %xmm7
	movdqa	.LC3(%rip), %xmm6
	leal	(%r9,%r9), %edx
	addl	$3, %eax
	cmpl	%eax, %edx
	jge	.L40
.L39:
	movq	40(%rsp), %rax
	subq	%fs:40, %rax
	jne	.L57
	addq	$56, %rsp
	.cfi_remember_state
	.cfi_def_cfa_offset 56
	popq	%rbx
	.cfi_def_cfa_offset 48
	popq	%rbp
	.cfi_def_cfa_offset 40
	popq	%r12
	.cfi_def_cfa_offset 32
	popq	%r13
	.cfi_def_cfa_offset 24
	popq	%r14
	.cfi_def_cfa_offset 16
	popq	%r15
	.cfi_def_cfa_offset 8
	ret
	.p2align 4,,10
	.p2align 3
.L51:
	.cfi_restore_state
	movl	$1, %edx
	xorl	%ebp, %ebp
	jmp	.L41
.L57:
	call	__stack_chk_fail@PLT
	.cfi_endproc
.LFE43:
	.size	run, .-run
	.section	.text.startup,"ax",@progbits
	.p2align 4
	.globl	main
	.type	main, @function
main:
.LFB44:
	.cfi_startproc
	endbr64
	subq	$8, %rsp
	.cfi_def_cfa_offset 16
	call	run
	xorl	%eax, %eax
	addq	$8, %rsp
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE44:
	.size	main, .-main
	.globl	iFact
	.bss
	.align 8
	.type	iFact, @object
	.size	iFact, 8
iFact:
	.zero	8
	.globl	fact
	.align 8
	.type	fact, @object
	.size	fact, 8
fact:
	.zero	8
	.globl	mod
	.section	.rodata
	.align 4
	.type	mod, @object
	.size	mod, 4
mod:
	.long	998244353
	.section	.rodata.cst16,"aM",@progbits,16
	.align 16
.LC0:
	.long	1
	.long	2
	.long	3
	.long	4
	.align 16
.LC2:
	.long	-4
	.long	-4
	.long	-4
	.long	-4
	.align 16
.LC3:
	.long	4
	.long	4
	.long	4
	.long	4
	.ident	"GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:

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

typedef int32_t i32;
typedef int64_t i64;

const i32 mod = 998244353;

i32 mod_pow (i32 r, i32 n) {
  i32 t = 1;
  i32 s = r;
  while (n > 0) {
    if (n & 1) t = (i64) t * s % mod;
    s = (i64) s * s % mod;
    n >>= 1;
  }
  return t;
}

i32 inv (i32 a) {
  return mod_pow (a, mod - 2);
}

i32 *fact = NULL;
i32 *iFact = NULL;
void init_fact (const i32 n) {
  fact = (i32 *) calloc (n + 1, sizeof (i32));
  fact[0] = 1;
  for (i32 i = 1; i <= n; ++i) {
    fact[i] = (i64) i * fact[i - 1] % mod;
  }
  iFact = (i32 *) calloc (n + 1, sizeof (i32));
  iFact[n] = inv (fact[n]);
  for (i32 i = n - 1; i >= 0; --i) {
    iFact[i] = (i64) (i + 1) * iFact[i + 1] % mod;
  }
}

i32 comb (i32 n, i32 k) {
  if (!(0 <= k && k <= n)) return 0;
  return (i64) fact[n] * iFact[k] % mod * iFact[n - k] % mod;
}

void run (void) {
  i32 k, n;
  scanf ("%" SCNi32 "%" SCNi32, &k, &n);
  init_fact (n + k);
  for (i32 i = 2; i <= 2 * k; ++i) {
    i32 c = 0;
    for (i32 j = 1, l = i - 1; j <= l; ++j, --l) {
      c += j <= k && l <= k ? 1 : 0;
    }
    i32 ans = 0;
    for (i32 j = 0, p = 1; j <= c; ++j, p = 2 * p % mod) {
      i32 way = (i64) comb (c, j) * p % mod;
      ans = (ans + (i64) way * comb (n - j + (k - (2 * c - j)) - 1, n - j)) % mod;
    }
    printf ("%" PRIi32 "\n", ans);
  }
}

int main (void) {
  run();
  return 0;
}

8 1000
 3 6
 1 5
 13 1000
 18 1000
 18 1100
 2 3
 18 0100
 5 3
 21 1100

172955709
172955709
215375670
215375670
257477746
257477746
670183294
670183294
670183294
257477746
257477746
215375670
215375670
172955709
172955709
 13
13
4
13
13
 0
 497036381
497036381
419411018
419411018
948498877
948498877
80387296
80387296
341522806
341522806
492575700
492575700
300011477
492575700
492575700
341522806
341522806
80387296
80387296
948498877
948498877
419411018
419411018
497036381
497036381
 701224094
701224094
664831880
664831880
891475329
891475329
199895538
199895538
536675936
536675936
454801709
454801709
27559258
27559258
346891948
346891948
154765409
154765409
154765409
346891948
346891948
27559258
27559258
454801709
454801709
536675936
536675936
199895538
199895538
891475329
891475329
664831880
664831880
701224094
701224094
 678273158
678273158
684817417
684817417
30535091
30535091
754927577
754927577
178701636
178701636
786022133
786022133
65850792
65850792
848151174
848151174
25962462
25962462
25962462
848151174
848151174
65850792
65850792
786022133
786022133
178701636
178701636
754927577
754927577
30535091
30535091
684817417
684817417
678273158
678273158
 2
2
2
 281375925
281375925
804160883
804160883
633730392
633730392
338580398
338580398
284389701
284389701
906924288
906924288
696987626
696987626
110406786
110406786
371028449
371028449
371028449
110406786
110406786
696987626
696987626
906924288
906924288
284389701
284389701
338580398
338580398
633730392
633730392
804160883
804160883
281375925
281375925
 30
30
25
25
20
25
25
30
30
 53071304
53071304
615769928
615769928
420248395
420248395
53077309
53077309
96175104
96175104
422310606
422310606
786761162
786761162
769373428
769373428
647001302
647001302
164038326
164038326
365502333
164038326
164038326
647001302
647001302
769373428
769373428
786761162
786761162
422310606
422310606
96175104
96175104
53077309
53077309
420248395
420248395
615769928
615769928
53071304
53071304

Given the following C code and unoptimized assembly code, your task is to generate highly optimized x86-64 assembly code.
C Code:

```c
#include<stdio.h>
#include<stdlib.h>
#include<stdint.h>
#include<inttypes.h>

typedef int32_t i32;
typedef int64_t i64;

const i32 mod = 998244353;

i32 mod_pow (i32 r, i32 n) {
  i32 t = 1;
  i32 s = r;
  while (n > 0) {
    if (n & 1) t = (i64) t * s % mod;
    s = (i64) s * s % mod;
    n >>= 1;
  }
  return t;
}

i32 inv (i32 a) {
  return mod_pow (a, mod - 2);
}

i32 *fact = NULL;
i32 *iFact = NULL;
void init_fact (const i32 n) {
  fact = (i32 *) calloc (n + 1, sizeof (i32));
  fact[0] = 1;
  for (i32 i = 1; i <= n; ++i) {
    fact[i] = (i64) i * fact[i - 1] % mod;
  }
  iFact = (i32 *) calloc (n + 1, sizeof (i32));
  iFact[n] = inv (fact[n]);
  for (i32 i = n - 1; i >= 0; --i) {
    iFact[i] = (i64) (i + 1) * iFact[i + 1] % mod;
  }
}

i32 comb (i32 n, i32 k) {
  if (!(0 <= k && k <= n)) return 0;
  return (i64) fact[n] * iFact[k] % mod * iFact[n - k] % mod;
}

void run (void) {
  i32 k, n;
  scanf ("%" SCNi32 "%" SCNi32, &k, &n);
  init_fact (n + k);
  for (i32 i = 2; i <= 2 * k; ++i) {
    i32 c = 0;
    for (i32 j = 1, l = i - 1; j <= l; ++j, --l) {
      c += j <= k && l <= k ? 1 : 0;
    }
    i32 ans = 0;
    for (i32 j = 0, p = 1; j <= c; ++j, p = 2 * p % mod) {
      i32 way = (i64) comb (c, j) * p % mod;
      ans = (ans + (i64) way * comb (n - j + (k - (2 * c - j)) - 1, n - j)) % mod;
    }
    printf ("%" PRIi32 "\n", ans);
  }
}

int main (void) {
  run();
  return 0;
}
```

Unoptimized Assembly Code:

```assembly
	.file	"temp.c"
	.text
	.globl	mod
	.section	.rodata
	.align 4
	.type	mod, @object
	.size	mod, 4
mod:
	.long	998244353
	.text
	.globl	mod_pow
	.type	mod_pow, @function
mod_pow:
.LFB6:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -20(%rbp)
	movl	%esi, -24(%rbp)
	movl	$1, -8(%rbp)
	movl	-20(%rbp), %eax
	movl	%eax, -4(%rbp)
	jmp	.L2
.L4:
	movl	-24(%rbp), %eax
	andl	$1, %eax
	testl	%eax, %eax
	je	.L3
	movl	-8(%rbp), %eax
	movslq	%eax, %rdx
	movl	-4(%rbp), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -8(%rbp)
.L3:
	movl	-4(%rbp), %eax
	movslq	%eax, %rdx
	movl	-4(%rbp), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -4(%rbp)
	sarl	-24(%rbp)
.L2:
	cmpl	$0, -24(%rbp)
	jg	.L4
	movl	-8(%rbp), %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE6:
	.size	mod_pow, .-mod_pow
	.globl	inv
	.type	inv, @function
inv:
.LFB7:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$8, %rsp
	movl	%edi, -4(%rbp)
	movl	$998244353, %eax
	leal	-2(%rax), %edx
	movl	-4(%rbp), %eax
	movl	%edx, %esi
	movl	%eax, %edi
	call	mod_pow
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE7:
	.size	inv, .-inv
	.globl	fact
	.bss
	.align 8
	.type	fact, @object
	.size	fact, 8
fact:
	.zero	8
	.globl	iFact
	.align 8
	.type	iFact, @object
	.size	iFact, 8
iFact:
	.zero	8
	.text
	.globl	init_fact
	.type	init_fact, @function
init_fact:
.LFB8:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	pushq	%rbx
	subq	$40, %rsp
	.cfi_offset 3, -24
	movl	%edi, -36(%rbp)
	movl	-36(%rbp), %eax
	addl	$1, %eax
	cltq
	movl	$4, %esi
	movq	%rax, %rdi
	call	calloc@PLT
	movq	%rax, fact(%rip)
	movq	fact(%rip), %rax
	movl	$1, (%rax)
	movl	$1, -24(%rbp)
	jmp	.L9
.L10:
	movl	-24(%rbp), %eax
	movslq	%eax, %rdx
	movq	fact(%rip), %rcx
	movl	-24(%rbp), %eax
	cltq
	salq	$2, %rax
	subq	$4, %rax
	addq	%rcx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rcx
	movq	fact(%rip), %rdx
	movl	-24(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	%ecx, %edx
	movl	%edx, (%rax)
	addl	$1, -24(%rbp)
.L9:
	movl	-24(%rbp), %eax
	cmpl	-36(%rbp), %eax
	jle	.L10
	movl	-36(%rbp), %eax
	addl	$1, %eax
	cltq
	movl	$4, %esi
	movq	%rax, %rdi
	call	calloc@PLT
	movq	%rax, iFact(%rip)
	movq	fact(%rip), %rdx
	movl	-36(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	(%rax), %eax
	movq	iFact(%rip), %rcx
	movl	-36(%rbp), %edx
	movslq	%edx, %rdx
	salq	$2, %rdx
	leaq	(%rcx,%rdx), %rbx
	movl	%eax, %edi
	call	inv
	movl	%eax, (%rbx)
	movl	-36(%rbp), %eax
	subl	$1, %eax
	movl	%eax, -20(%rbp)
	jmp	.L11
.L12:
	movl	-20(%rbp), %eax
	addl	$1, %eax
	movslq	%eax, %rdx
	movq	iFact(%rip), %rcx
	movl	-20(%rbp), %eax
	cltq
	addq	$1, %rax
	salq	$2, %rax
	addq	%rcx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rcx
	movq	iFact(%rip), %rdx
	movl	-20(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	%ecx, %edx
	movl	%edx, (%rax)
	subl	$1, -20(%rbp)
.L11:
	cmpl	$0, -20(%rbp)
	jns	.L12
	nop
	nop
	movq	-8(%rbp), %rbx
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE8:
	.size	init_fact, .-init_fact
	.globl	comb
	.type	comb, @function
comb:
.LFB9:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -4(%rbp)
	movl	%esi, -8(%rbp)
	cmpl	$0, -8(%rbp)
	js	.L14
	movl	-8(%rbp), %eax
	cmpl	-4(%rbp), %eax
	jle	.L15
.L14:
	movl	$0, %eax
	jmp	.L16
.L15:
	movq	fact(%rip), %rdx
	movl	-4(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	(%rax), %eax
	movslq	%eax, %rdx
	movq	iFact(%rip), %rcx
	movl	-8(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rcx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rcx
	movq	iFact(%rip), %rdx
	movl	-4(%rbp), %eax
	subl	-8(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rcx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
.L16:
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE9:
	.size	comb, .-comb
	.section	.rodata
.LC0:
	.string	"%i%i"
.LC1:
	.string	"%i\n"
	.text
	.globl	run
	.type	run, @function
run:
.LFB10:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	pushq	%r12
	pushq	%rbx
	subq	$48, %rsp
	.cfi_offset 12, -24
	.cfi_offset 3, -32
	movq	%fs:40, %rax
	movq	%rax, -24(%rbp)
	xorl	%eax, %eax
	leaq	-60(%rbp), %rdx
	leaq	-64(%rbp), %rax
	movq	%rax, %rsi
	leaq	.LC0(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	__isoc99_scanf@PLT
	movl	-60(%rbp), %edx
	movl	-64(%rbp), %eax
	addl	%edx, %eax
	movl	%eax, %edi
	call	init_fact
	movl	$2, -56(%rbp)
	jmp	.L18
.L25:
	movl	$0, -52(%rbp)
	movl	$1, -48(%rbp)
	movl	-56(%rbp), %eax
	subl	$1, %eax
	movl	%eax, -44(%rbp)
	jmp	.L19
.L22:
	movl	-64(%rbp), %eax
	cmpl	%eax, -48(%rbp)
	jg	.L20
	movl	-64(%rbp), %eax
	cmpl	%eax, -44(%rbp)
	jg	.L20
	movl	$1, %eax
	jmp	.L21
.L20:
	movl	$0, %eax
.L21:
	addl	%eax, -52(%rbp)
	addl	$1, -48(%rbp)
	subl	$1, -44(%rbp)
.L19:
	movl	-48(%rbp), %eax
	cmpl	-44(%rbp), %eax
	jle	.L22
	movl	$0, -40(%rbp)
	movl	$0, -36(%rbp)
	movl	$1, -32(%rbp)
	jmp	.L23
.L24:
	movl	-36(%rbp), %edx
	movl	-52(%rbp), %eax
	movl	%edx, %esi
	movl	%eax, %edi
	call	comb
	movslq	%eax, %rdx
	movl	-32(%rbp), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -28(%rbp)
	movl	-40(%rbp), %eax
	movslq	%eax, %r12
	movl	-28(%rbp), %eax
	movslq	%eax, %rbx
	movl	-60(%rbp), %eax
	subl	-36(%rbp), %eax
	movl	-60(%rbp), %edx
	movl	%edx, %esi
	subl	-36(%rbp), %esi
	movl	-64(%rbp), %edx
	movl	-52(%rbp), %ecx
	addl	%ecx, %ecx
	subl	-36(%rbp), %ecx
	subl	%ecx, %edx
	addl	%esi, %edx
	subl	$1, %edx
	movl	%eax, %esi
	movl	%edx, %edi
	call	comb
	cltq
	imulq	%rbx, %rax
	addq	%r12, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -40(%rbp)
	addl	$1, -36(%rbp)
	movl	-32(%rbp), %eax
	addl	%eax, %eax
	movl	$998244353, %ecx
	cltd
	idivl	%ecx
	movl	%edx, -32(%rbp)
.L23:
	movl	-36(%rbp), %eax
	cmpl	-52(%rbp), %eax
	jle	.L24
	movl	-40(%rbp), %eax
	movl	%eax, %esi
	leaq	.LC1(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	printf@PLT
	addl	$1, -56(%rbp)
.L18:
	movl	-64(%rbp), %eax
	addl	%eax, %eax
	cmpl	%eax, -56(%rbp)
	jle	.L25
	nop
	movq	-24(%rbp), %rax
	subq	%fs:40, %rax
	je	.L26
	call	__stack_chk_fail@PLT
.L26:
	addq	$48, %rsp
	popq	%rbx
	popq	%r12
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE10:
	.size	run, .-run
	.globl	main
	.type	main, @function
main:
.LFB11:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	call	run
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE11:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:
```

Only output the optimized assembly code. Do not include any other text. Do not write any comments in the assembly code. Wrap the assembly code in ```assembly``` tags.
train
	.file	"temp.c"
	.text
	.globl	mod
	.section	.rodata
	.align 4
	.type	mod, @object
	.size	mod, 4
mod:
	.long	998244353
	.text
	.globl	mod_pow
	.type	mod_pow, @function
mod_pow:
.LFB6:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -20(%rbp)
	movl	%esi, -24(%rbp)
	movl	$1, -8(%rbp)
	movl	-20(%rbp), %eax
	movl	%eax, -4(%rbp)
	jmp	.L2
.L4:
	movl	-24(%rbp), %eax
	andl	$1, %eax
	testl	%eax, %eax
	je	.L3
	movl	-8(%rbp), %eax
	movslq	%eax, %rdx
	movl	-4(%rbp), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -8(%rbp)
.L3:
	movl	-4(%rbp), %eax
	movslq	%eax, %rdx
	movl	-4(%rbp), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -4(%rbp)
	sarl	-24(%rbp)
.L2:
	cmpl	$0, -24(%rbp)
	jg	.L4
	movl	-8(%rbp), %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE6:
	.size	mod_pow, .-mod_pow
	.globl	inv
	.type	inv, @function
inv:
.LFB7:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	subq	$8, %rsp
	movl	%edi, -4(%rbp)
	movl	$998244353, %eax
	leal	-2(%rax), %edx
	movl	-4(%rbp), %eax
	movl	%edx, %esi
	movl	%eax, %edi
	call	mod_pow
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE7:
	.size	inv, .-inv
	.globl	fact
	.bss
	.align 8
	.type	fact, @object
	.size	fact, 8
fact:
	.zero	8
	.globl	iFact
	.align 8
	.type	iFact, @object
	.size	iFact, 8
iFact:
	.zero	8
	.text
	.globl	init_fact
	.type	init_fact, @function
init_fact:
.LFB8:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	pushq	%rbx
	subq	$40, %rsp
	.cfi_offset 3, -24
	movl	%edi, -36(%rbp)
	movl	-36(%rbp), %eax
	addl	$1, %eax
	cltq
	movl	$4, %esi
	movq	%rax, %rdi
	call	calloc@PLT
	movq	%rax, fact(%rip)
	movq	fact(%rip), %rax
	movl	$1, (%rax)
	movl	$1, -24(%rbp)
	jmp	.L9
.L10:
	movl	-24(%rbp), %eax
	movslq	%eax, %rdx
	movq	fact(%rip), %rcx
	movl	-24(%rbp), %eax
	cltq
	salq	$2, %rax
	subq	$4, %rax
	addq	%rcx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rcx
	movq	fact(%rip), %rdx
	movl	-24(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	%ecx, %edx
	movl	%edx, (%rax)
	addl	$1, -24(%rbp)
.L9:
	movl	-24(%rbp), %eax
	cmpl	-36(%rbp), %eax
	jle	.L10
	movl	-36(%rbp), %eax
	addl	$1, %eax
	cltq
	movl	$4, %esi
	movq	%rax, %rdi
	call	calloc@PLT
	movq	%rax, iFact(%rip)
	movq	fact(%rip), %rdx
	movl	-36(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	(%rax), %eax
	movq	iFact(%rip), %rcx
	movl	-36(%rbp), %edx
	movslq	%edx, %rdx
	salq	$2, %rdx
	leaq	(%rcx,%rdx), %rbx
	movl	%eax, %edi
	call	inv
	movl	%eax, (%rbx)
	movl	-36(%rbp), %eax
	subl	$1, %eax
	movl	%eax, -20(%rbp)
	jmp	.L11
.L12:
	movl	-20(%rbp), %eax
	addl	$1, %eax
	movslq	%eax, %rdx
	movq	iFact(%rip), %rcx
	movl	-20(%rbp), %eax
	cltq
	addq	$1, %rax
	salq	$2, %rax
	addq	%rcx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rcx
	movq	iFact(%rip), %rdx
	movl	-20(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	%ecx, %edx
	movl	%edx, (%rax)
	subl	$1, -20(%rbp)
.L11:
	cmpl	$0, -20(%rbp)
	jns	.L12
	nop
	nop
	movq	-8(%rbp), %rbx
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE8:
	.size	init_fact, .-init_fact
	.globl	comb
	.type	comb, @function
comb:
.LFB9:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	%edi, -4(%rbp)
	movl	%esi, -8(%rbp)
	cmpl	$0, -8(%rbp)
	js	.L14
	movl	-8(%rbp), %eax
	cmpl	-4(%rbp), %eax
	jle	.L15
.L14:
	movl	$0, %eax
	jmp	.L16
.L15:
	movq	fact(%rip), %rdx
	movl	-4(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	(%rax), %eax
	movslq	%eax, %rdx
	movq	iFact(%rip), %rcx
	movl	-8(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rcx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rcx
	movq	iFact(%rip), %rdx
	movl	-4(%rbp), %eax
	subl	-8(%rbp), %eax
	cltq
	salq	$2, %rax
	addq	%rdx, %rax
	movl	(%rax), %eax
	cltq
	imulq	%rcx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
.L16:
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE9:
	.size	comb, .-comb
	.section	.rodata
.LC0:
	.string	"%i%i"
.LC1:
	.string	"%i\n"
	.text
	.globl	run
	.type	run, @function
run:
.LFB10:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	pushq	%r12
	pushq	%rbx
	subq	$48, %rsp
	.cfi_offset 12, -24
	.cfi_offset 3, -32
	movq	%fs:40, %rax
	movq	%rax, -24(%rbp)
	xorl	%eax, %eax
	leaq	-60(%rbp), %rdx
	leaq	-64(%rbp), %rax
	movq	%rax, %rsi
	leaq	.LC0(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	__isoc99_scanf@PLT
	movl	-60(%rbp), %edx
	movl	-64(%rbp), %eax
	addl	%edx, %eax
	movl	%eax, %edi
	call	init_fact
	movl	$2, -56(%rbp)
	jmp	.L18
.L25:
	movl	$0, -52(%rbp)
	movl	$1, -48(%rbp)
	movl	-56(%rbp), %eax
	subl	$1, %eax
	movl	%eax, -44(%rbp)
	jmp	.L19
.L22:
	movl	-64(%rbp), %eax
	cmpl	%eax, -48(%rbp)
	jg	.L20
	movl	-64(%rbp), %eax
	cmpl	%eax, -44(%rbp)
	jg	.L20
	movl	$1, %eax
	jmp	.L21
.L20:
	movl	$0, %eax
.L21:
	addl	%eax, -52(%rbp)
	addl	$1, -48(%rbp)
	subl	$1, -44(%rbp)
.L19:
	movl	-48(%rbp), %eax
	cmpl	-44(%rbp), %eax
	jle	.L22
	movl	$0, -40(%rbp)
	movl	$0, -36(%rbp)
	movl	$1, -32(%rbp)
	jmp	.L23
.L24:
	movl	-36(%rbp), %edx
	movl	-52(%rbp), %eax
	movl	%edx, %esi
	movl	%eax, %edi
	call	comb
	movslq	%eax, %rdx
	movl	-32(%rbp), %eax
	cltq
	imulq	%rdx, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -28(%rbp)
	movl	-40(%rbp), %eax
	movslq	%eax, %r12
	movl	-28(%rbp), %eax
	movslq	%eax, %rbx
	movl	-60(%rbp), %eax
	subl	-36(%rbp), %eax
	movl	-60(%rbp), %edx
	movl	%edx, %esi
	subl	-36(%rbp), %esi
	movl	-64(%rbp), %edx
	movl	-52(%rbp), %ecx
	addl	%ecx, %ecx
	subl	-36(%rbp), %ecx
	subl	%ecx, %edx
	addl	%esi, %edx
	subl	$1, %edx
	movl	%eax, %esi
	movl	%edx, %edi
	call	comb
	cltq
	imulq	%rbx, %rax
	addq	%r12, %rax
	movl	$998244353, %edx
	movslq	%edx, %rcx
	cqto
	idivq	%rcx
	movq	%rdx, %rax
	movl	%eax, -40(%rbp)
	addl	$1, -36(%rbp)
	movl	-32(%rbp), %eax
	addl	%eax, %eax
	movl	$998244353, %ecx
	cltd
	idivl	%ecx
	movl	%edx, -32(%rbp)
.L23:
	movl	-36(%rbp), %eax
	cmpl	-52(%rbp), %eax
	jle	.L24
	movl	-40(%rbp), %eax
	movl	%eax, %esi
	leaq	.LC1(%rip), %rax
	movq	%rax, %rdi
	movl	$0, %eax
	call	printf@PLT
	addl	$1, -56(%rbp)
.L18:
	movl	-64(%rbp), %eax
	addl	%eax, %eax
	cmpl	%eax, -56(%rbp)
	jle	.L25
	nop
	movq	-24(%rbp), %rax
	subq	%fs:40, %rax
	je	.L26
	call	__stack_chk_fail@PLT
.L26:
	addq	$48, %rsp
	popq	%rbx
	popq	%r12
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE10:
	.size	run, .-run
	.globl	main
	.type	main, @function
main:
.LFB11:
	.cfi_startproc
	endbr64
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	call	run
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE11:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0"
	.section	.note.GNU-stack,"",@progbits
	.section	.note.gnu.property,"a"
	.align 8
	.long	1f - 0f
	.long	4f - 1f
	.long	5
0:
	.string	"GNU"
1:
	.align 8
	.long	0xc0000002
	.long	3f - 2f
2:
	.long	0x3
3:
	.align 8
4:
