Problem 865

T(10^4) mod 998244353.

Answer761181918
Output761181918
StatusPASS
Native helperno
Runtime70 ms
Peak memory1200 KB
Time complexityO(n^2) (estimated)
Space complexityO(n^2) (estimated)

Performance comparison

MetricOur solutionBest known
Time complexityO(n^2)?
Space complexityO(n^2)?
ApproachFlow solutionNot curated
VerdictUnknown

Flow source

# Project Euler 865: Triplicate Numbers
# T(10^4) mod 998244353.

extern {
    function calloc(n: i64, size: i64) -> ptr<void>
    function free(p: ptr<void>) -> void
}

const MOD: i64 = 998244353
const K: i64 = 10
const MMAX: i64 = 3333

function main() -> i32 {
    let mmax: i64 = MMAX
    let dp0: ptr<i64> = calloc(mmax + 1, 8)
    let dp1: ptr<i64> = calloc(mmax + 1, 8)
    let f: ptr<i64> = calloc(mmax + 1, 8)
    let mul: ptr<i64> = calloc(mmax + 1, 8)
    let pref: ptr<i64> = calloc(mmax + 1, 8)

    let k: i64 = K
    let km1: i64 = K - 1
    let twok: i64 = 2 * K
    let twokm1: i64 = 2 * (K - 1)

    dp0[1] = k
    dp1[1] = km1
    f[1] = km1
    pref[1] = dp1[1]

    let mut m: i64 = 2
    while m <= mmax {
        let mut f_m: i64 = km1 * f[m - 1] % MOD
        let mut dp0_m: i64 = k * dp0[m - 1] % MOD
        let mut dp1_m: i64 = k * dp1[m - 1] % MOD

        let mut s: i64 = 2
        while s <= m {
            let p: i64 = m - s
            let x: i64 = f[s - 1]

            if p == 0 {
                f_m = (f_m + twokm1 * x) % MOD
                dp0_m = (dp0_m + twok * x) % MOD
                dp1_m = (dp1_m + twokm1 * x) % MOD
                if s >= 3 {
                    let y: i64 = mul[s - 1]
                    f_m = (f_m + km1 * y) % MOD
                    dp0_m = (dp0_m + k * y) % MOD
                    dp1_m = (dp1_m + km1 * y) % MOD
                }
            } else {
                let fp: i64 = f[p]
                let d0p: i64 = dp0[p]
                let d1p: i64 = dp1[p]
                f_m = (f_m + twokm1 * x % MOD * fp) % MOD
                dp0_m = (dp0_m + twok * x % MOD * d0p) % MOD
                dp1_m = (dp1_m + twok * x % MOD * d1p) % MOD
                if s >= 3 {
                    let y: i64 = mul[s - 1]
                    f_m = (f_m + km1 * y % MOD * fp) % MOD
                    dp0_m = (dp0_m + k * y % MOD * d0p) % MOD
                    dp1_m = (dp1_m + k * y % MOD * d1p) % MOD
                }
            }

            if (s & 63) == 0 {
                f_m = f_m % MOD
                dp0_m = dp0_m % MOD
                dp1_m = dp1_m % MOD
            }
            s = s + 1
        }

        f_m = f_m % MOD
        dp0_m = dp0_m % MOD
        dp1_m = dp1_m % MOD

        f[m] = f_m
        dp0[m] = dp0_m
        dp1[m] = dp1_m

        let mut acc: i64 = 0
        let mut a: i64 = 1
        while a < m {
            acc = (acc + f[a] * f[m - a] % MOD) % MOD
            a = a + 1
        }
        mul[m] = acc

        pref[m] = (pref[m - 1] + dp1[m]) % MOD
        m = m + 1
    }

    printf("%lld\n", pref[mmax] % MOD)
    free(dp0)
    free(dp1)
    free(f)
    free(mul)
    free(pref)
    return 0
}

Generated C

#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Flow runtime helpers */
typedef struct flow_temp_node { struct flow_temp_node* next; } flow_temp_node;
static flow_temp_node* flow_temp_head = NULL;
static int flow_temp_atexit_set = 0;
__attribute__((unused)) static void flow_temp_free_all(void) {
    while (flow_temp_head) {
        flow_temp_node* n = flow_temp_head;
        flow_temp_head = n->next;
        free(n);
    }
}
__attribute__((unused)) static void* flow_temp_alloc(size_t nbytes) {
    flow_temp_node* node = (flow_temp_node*)malloc(sizeof(flow_temp_node) + nbytes);
    if (!node) return NULL;
    node->next = flow_temp_head;
    flow_temp_head = node;
    if (!flow_temp_atexit_set) {
        flow_temp_atexit_set = 1;
        atexit(flow_temp_free_all);
    }
    return (void*)(node + 1);
}
#ifndef FLOW_DIAG
#define FLOW_DIAG(msg) fprintf(stderr, "%s", (msg))
#endif
#ifndef FLOW_LOG
#define FLOW_LOG(fmt, ...) printf(fmt, __VA_ARGS__)
#endif
#ifndef FLOW_LOG_EMPTY
#define FLOW_LOG_EMPTY(fmt) printf(fmt)
#endif
static char* flow_strcat(const char* a, const char* b) {
    size_t la = strlen(a ? a : ""), lb = strlen(b ? b : "");
    char* r = (char*)flow_temp_alloc(la + lb + 1);
    if (!r) return NULL;
    if (la) memcpy(r, a, la);
    if (lb) memcpy(r + la, b, lb);
    r[la + lb] = '\0';
    return r;
}

#define __flow_in_arr(arr, val) __extension__ ({ \
    int _found = 0; \
    size_t _n = sizeof(arr)/sizeof((arr)[0]); \
    for (size_t _i = 0; _i < _n; _i++) { \
        if ((arr)[_i] == (val)) { _found = 1; break; } \
    } _found; })

/* Unified fault handler (MISRA #279) — override with -DFLOW_FAULT_HANDLER=fn */
#ifndef FLOW_FAULT_HANDLER
__attribute__((unused)) static inline void flow_fault_handler(const char* msg) {
    fprintf(stderr, "flow: %s\n", msg ? msg : "fault");
    abort();
#if defined(__GNUC__) || defined(__clang__)
    __builtin_unreachable();
#endif
}
#else
#define flow_fault_handler FLOW_FAULT_HANDLER
#endif
#define flow_div_by_zero_handler() flow_fault_handler("division by zero")
#define flow_shift_ub_handler() flow_fault_handler("invalid shift (amount out of range or left-shift of negative)")

#ifndef FLOW_CHECKED_DIV
#define FLOW_CHECKED_DIV(L, R) (((R) != 0) ? ((L) / (R)) : (flow_div_by_zero_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_MOD
#define FLOW_CHECKED_MOD(L, R) (((R) != 0) ? ((L) % (R)) : (flow_div_by_zero_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_SHL
#define FLOW_CHECKED_SHL(L, R) ((((R) >= 0) && ((unsigned long long)(R) < (sizeof(L) * 8ull)) && ((L) >= 0)) ? ((L) << (R)) : (flow_shift_ub_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_SHR
#define FLOW_CHECKED_SHR(L, R) ((((R) >= 0) && ((unsigned long long)(R) < (sizeof(L) * 8ull))) ? ((L) >> (R)) : (flow_shift_ub_handler(), (L) * 0))
#endif

#include <math.h>

void* _ui_state = NULL;

static inline float i32_to_f32(int32_t v) { return (float)v; }

/* Host stub for @gpu kernels (device codegen replaces this). */
static inline int32_t gpu_thread_id(void) { return 0; }

int32_t main(void);

static const int64_t MOD = 998244353;
static const int64_t K = 10;
static const int64_t MMAX = 3333;



int32_t main(void) {
    int64_t mmax = MMAX;
    int64_t* dp0 = (int64_t*)(calloc((mmax + 1), 8));
    int64_t* dp1 = (int64_t*)(calloc((mmax + 1), 8));
    int64_t* f = (int64_t*)(calloc((mmax + 1), 8));
    int64_t* mul = (int64_t*)(calloc((mmax + 1), 8));
    int64_t* pref = (int64_t*)(calloc((mmax + 1), 8));
    int64_t k = K;
    int64_t km1 = (K - 1);
    int64_t twok = (2 * K);
    int64_t twokm1 = (2 * (K - 1));
    dp0[1] = k;
    dp1[1] = km1;
    f[1] = km1;
    pref[1] = dp1[1];
    int64_t m = 2;
    while (m <= mmax) {
        int64_t f_m = FLOW_CHECKED_MOD(((km1 * f[(m - 1)])), (MOD));
        int64_t dp0_m = FLOW_CHECKED_MOD(((k * dp0[(m - 1)])), (MOD));
        int64_t dp1_m = FLOW_CHECKED_MOD(((k * dp1[(m - 1)])), (MOD));
        int64_t s = 2;
        while (s <= m) {
            int64_t p = (m - s);
            int64_t x = f[(s - 1)];
            if (p == 0) {
                f_m = FLOW_CHECKED_MOD(((f_m + (twokm1 * x))), (MOD));
                dp0_m = FLOW_CHECKED_MOD(((dp0_m + (twok * x))), (MOD));
                dp1_m = FLOW_CHECKED_MOD(((dp1_m + (twokm1 * x))), (MOD));
                if (s >= 3) {
                    int64_t y = mul[(s - 1)];
                    f_m = FLOW_CHECKED_MOD(((f_m + (km1 * y))), (MOD));
                    dp0_m = FLOW_CHECKED_MOD(((dp0_m + (k * y))), (MOD));
                    dp1_m = FLOW_CHECKED_MOD(((dp1_m + (km1 * y))), (MOD));
                }
            } else {
                int64_t fp = f[p];
                int64_t d0p = dp0[p];
                int64_t d1p = dp1[p];
                f_m = FLOW_CHECKED_MOD(((f_m + (FLOW_CHECKED_MOD(((twokm1 * x)), (MOD)) * fp))), (MOD));
                dp0_m = FLOW_CHECKED_MOD(((dp0_m + (FLOW_CHECKED_MOD(((twok * x)), (MOD)) * d0p))), (MOD));
                dp1_m = FLOW_CHECKED_MOD(((dp1_m + (FLOW_CHECKED_MOD(((twok * x)), (MOD)) * d1p))), (MOD));
                if (s >= 3) {
                    int64_t y = mul[(s - 1)];
                    f_m = FLOW_CHECKED_MOD(((f_m + (FLOW_CHECKED_MOD(((km1 * y)), (MOD)) * fp))), (MOD));
                    dp0_m = FLOW_CHECKED_MOD(((dp0_m + (FLOW_CHECKED_MOD(((k * y)), (MOD)) * d0p))), (MOD));
                    dp1_m = FLOW_CHECKED_MOD(((dp1_m + (FLOW_CHECKED_MOD(((k * y)), (MOD)) * d1p))), (MOD));
                }
            }
            if ((s & 63) == 0) {
                f_m = FLOW_CHECKED_MOD((f_m), (MOD));
                dp0_m = FLOW_CHECKED_MOD((dp0_m), (MOD));
                dp1_m = FLOW_CHECKED_MOD((dp1_m), (MOD));
            }
            s = (s + 1);
        }
        f_m = FLOW_CHECKED_MOD((f_m), (MOD));
        dp0_m = FLOW_CHECKED_MOD((dp0_m), (MOD));
        dp1_m = FLOW_CHECKED_MOD((dp1_m), (MOD));
        f[m] = f_m;
        dp0[m] = dp0_m;
        dp1[m] = dp1_m;
        int64_t acc = 0;
        int64_t a = 1;
        while (a < m) {
            acc = FLOW_CHECKED_MOD(((acc + FLOW_CHECKED_MOD(((f[a] * f[(m - a)])), (MOD)))), (MOD));
            a = (a + 1);
        }
        mul[m] = acc;
        pref[m] = FLOW_CHECKED_MOD(((pref[(m - 1)] + dp1[m])), (MOD));
        m = (m + 1);
    }
    printf("%lld\n", FLOW_CHECKED_MOD((pref[mmax]), (MOD)));
    free(dp0);
    free(dp1);
    free(f);
    free(mul);
    free(pref);
    return 0;
}

Generated MLIR

module {
  llvm.func @printf(!llvm.ptr, ...) -> i32
  llvm.mlir.global internal constant @str_0("%lld\n\00") {addr_space = 0 : i32} : !llvm.array<6 x i8>
  func.func private @calloc(i64, i64) -> !llvm.ptr
  func.func private @free(!llvm.ptr) -> ()
  // Constant: MOD
  llvm.mlir.global internal constant @MOD(998244353 : i64) : i64
  // Constant: K
  llvm.mlir.global internal constant @K(10 : i64) : i64
  // Constant: MMAX
  llvm.mlir.global internal constant @MMAX(3333 : i64) : i64
  func.func @main() -> i32 {
    %0 = llvm.mlir.addressof @MMAX : !llvm.ptr
    %1 = llvm.load %0 : !llvm.ptr -> i64
    %3 = arith.constant 1 : i32
    %5 = arith.extsi %3 : i32 to i64
    %4 = arith.addi %1, %5 : i64
    %6 = arith.constant 8 : i32
    %7 = arith.extsi %6 : i32 to i64
    %2 = func.call @calloc(%4, %7) : (i64, i64) -> !llvm.ptr
    %9 = arith.constant 1 : i32
    %11 = arith.extsi %9 : i32 to i64
    %10 = arith.addi %1, %11 : i64
    %12 = arith.constant 8 : i32
    %13 = arith.extsi %12 : i32 to i64
    %8 = func.call @calloc(%10, %13) : (i64, i64) -> !llvm.ptr
    %15 = arith.constant 1 : i32
    %17 = arith.extsi %15 : i32 to i64
    %16 = arith.addi %1, %17 : i64
    %18 = arith.constant 8 : i32
    %19 = arith.extsi %18 : i32 to i64
    %14 = func.call @calloc(%16, %19) : (i64, i64) -> !llvm.ptr
    %21 = arith.constant 1 : i32
    %23 = arith.extsi %21 : i32 to i64
    %22 = arith.addi %1, %23 : i64
    %24 = arith.constant 8 : i32
    %25 = arith.extsi %24 : i32 to i64
    %20 = func.call @calloc(%22, %25) : (i64, i64) -> !llvm.ptr
    %27 = arith.constant 1 : i32
    %29 = arith.extsi %27 : i32 to i64
    %28 = arith.addi %1, %29 : i64
    %30 = arith.constant 8 : i32
    %31 = arith.extsi %30 : i32 to i64
    %26 = func.call @calloc(%28, %31) : (i64, i64) -> !llvm.ptr
    %32 = llvm.mlir.addressof @K : !llvm.ptr
    %33 = llvm.load %32 : !llvm.ptr -> i64
    %34 = llvm.mlir.addressof @K : !llvm.ptr
    %35 = llvm.load %34 : !llvm.ptr -> i64
    %36 = arith.constant 1 : i32
    %38 = arith.extsi %36 : i32 to i64
    %37 = arith.subi %35, %38 : i64
    %39 = arith.constant 2 : i32
    %40 = llvm.mlir.addressof @K : !llvm.ptr
    %41 = llvm.load %40 : !llvm.ptr -> i64
    %43 = arith.extsi %39 : i32 to i64
    %42 = arith.muli %43, %41 : i64
    %44 = arith.constant 2 : i32
    %45 = llvm.mlir.addressof @K : !llvm.ptr
    %46 = llvm.load %45 : !llvm.ptr -> i64
    %47 = arith.constant 1 : i32
    %49 = arith.extsi %47 : i32 to i64
    %48 = arith.subi %46, %49 : i64
    %51 = arith.extsi %44 : i32 to i64
    %50 = arith.muli %51, %48 : i64
    %52 = arith.constant 1 : i32
    %53 = arith.extsi %52 : i32 to i64
    %54 = llvm.getelementptr %2[%53] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %33, %54 : i64, !llvm.ptr
    %55 = arith.constant 1 : i32
    %56 = arith.extsi %55 : i32 to i64
    %57 = llvm.getelementptr %8[%56] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %37, %57 : i64, !llvm.ptr
    %58 = arith.constant 1 : i32
    %59 = arith.extsi %58 : i32 to i64
    %60 = llvm.getelementptr %14[%59] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %37, %60 : i64, !llvm.ptr
    %62 = arith.constant 1 : i32
    %63 = arith.extsi %62 : i32 to i64
    %64 = llvm.getelementptr %8[%63] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    %61 = llvm.load %64 : !llvm.ptr -> i64
    %65 = arith.constant 1 : i32
    %66 = arith.extsi %65 : i32 to i64
    %67 = llvm.getelementptr %26[%66] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %61, %67 : i64, !llvm.ptr
    %68 = arith.constant 2 : i32
    %69 = arith.extsi %68 : i32 to i64
    %70 = llvm.mlir.constant(1 : i64) : i64
    %71 = llvm.alloca %70 x i64 : (i64) -> !llvm.ptr
    llvm.store %69, %71 : i64, !llvm.ptr
    cf.br ^bb0
    ^bb0:
    %72 = llvm.load %71 : !llvm.ptr -> i64
    %73 = arith.cmpi sle, %72, %1 : i64
    cf.cond_br %73, ^bb1, ^bb2
    ^bb1:
      %75 = llvm.load %71 : !llvm.ptr -> i64
      %76 = arith.constant 1 : i32
      %78 = arith.extsi %76 : i32 to i64
      %77 = arith.subi %75, %78 : i64
      %79 = llvm.getelementptr %14[%77] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %74 = llvm.load %79 : !llvm.ptr -> i64
      %80 = arith.muli %37, %74 : i64
      %81 = llvm.mlir.addressof @MOD : !llvm.ptr
      %82 = llvm.load %81 : !llvm.ptr -> i64
      %83 = arith.remsi %80, %82 : i64
      %84 = llvm.mlir.constant(1 : i64) : i64
      %85 = llvm.alloca %84 x i64 : (i64) -> !llvm.ptr
      llvm.store %83, %85 : i64, !llvm.ptr
      %87 = llvm.load %71 : !llvm.ptr -> i64
      %88 = arith.constant 1 : i32
      %90 = arith.extsi %88 : i32 to i64
      %89 = arith.subi %87, %90 : i64
      %91 = llvm.getelementptr %2[%89] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %86 = llvm.load %91 : !llvm.ptr -> i64
      %92 = arith.muli %33, %86 : i64
      %93 = llvm.mlir.addressof @MOD : !llvm.ptr
      %94 = llvm.load %93 : !llvm.ptr -> i64
      %95 = arith.remsi %92, %94 : i64
      %96 = llvm.mlir.constant(1 : i64) : i64
      %97 = llvm.alloca %96 x i64 : (i64) -> !llvm.ptr
      llvm.store %95, %97 : i64, !llvm.ptr
      %99 = llvm.load %71 : !llvm.ptr -> i64
      %100 = arith.constant 1 : i32
      %102 = arith.extsi %100 : i32 to i64
      %101 = arith.subi %99, %102 : i64
      %103 = llvm.getelementptr %8[%101] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %98 = llvm.load %103 : !llvm.ptr -> i64
      %104 = arith.muli %33, %98 : i64
      %105 = llvm.mlir.addressof @MOD : !llvm.ptr
      %106 = llvm.load %105 : !llvm.ptr -> i64
      %107 = arith.remsi %104, %106 : i64
      %108 = llvm.mlir.constant(1 : i64) : i64
      %109 = llvm.alloca %108 x i64 : (i64) -> !llvm.ptr
      llvm.store %107, %109 : i64, !llvm.ptr
      %110 = arith.constant 2 : i32
      %111 = arith.extsi %110 : i32 to i64
      %112 = llvm.mlir.constant(1 : i64) : i64
      %113 = llvm.alloca %112 x i64 : (i64) -> !llvm.ptr
      llvm.store %111, %113 : i64, !llvm.ptr
      cf.br ^bb3
      ^bb3:
      %114 = llvm.load %113 : !llvm.ptr -> i64
      %115 = llvm.load %71 : !llvm.ptr -> i64
      %116 = arith.cmpi sle, %114, %115 : i64
      cf.cond_br %116, ^bb4, ^bb5
      ^bb4:
        %117 = llvm.load %71 : !llvm.ptr -> i64
        %118 = llvm.load %113 : !llvm.ptr -> i64
        %119 = arith.subi %117, %118 : i64
        %121 = llvm.load %113 : !llvm.ptr -> i64
        %122 = arith.constant 1 : i32
        %124 = arith.extsi %122 : i32 to i64
        %123 = arith.subi %121, %124 : i64
        %125 = llvm.getelementptr %14[%123] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        %120 = llvm.load %125 : !llvm.ptr -> i64
        %126 = arith.constant 0 : i32
        %128 = arith.extsi %126 : i32 to i64
        %127 = arith.cmpi eq, %119, %128 : i64
        cf.cond_br %127, ^bb6, ^bb7
        ^bb6:
          %129 = llvm.load %85 : !llvm.ptr -> i64
          %130 = arith.muli %50, %120 : i64
          %131 = arith.addi %129, %130 : i64
          %132 = llvm.mlir.addressof @MOD : !llvm.ptr
          %133 = llvm.load %132 : !llvm.ptr -> i64
          %134 = arith.remsi %131, %133 : i64
          llvm.store %134, %85 : i64, !llvm.ptr
          %135 = llvm.load %97 : !llvm.ptr -> i64
          %136 = arith.muli %42, %120 : i64
          %137 = arith.addi %135, %136 : i64
          %138 = llvm.mlir.addressof @MOD : !llvm.ptr
          %139 = llvm.load %138 : !llvm.ptr -> i64
          %140 = arith.remsi %137, %139 : i64
          llvm.store %140, %97 : i64, !llvm.ptr
          %141 = llvm.load %109 : !llvm.ptr -> i64
          %142 = arith.muli %50, %120 : i64
          %143 = arith.addi %141, %142 : i64
          %144 = llvm.mlir.addressof @MOD : !llvm.ptr
          %145 = llvm.load %144 : !llvm.ptr -> i64
          %146 = arith.remsi %143, %145 : i64
          llvm.store %146, %109 : i64, !llvm.ptr
          %147 = llvm.load %113 : !llvm.ptr -> i64
          %148 = arith.constant 3 : i32
          %150 = arith.extsi %148 : i32 to i64
          %149 = arith.cmpi sge, %147, %150 : i64
          cf.cond_br %149, ^bb9, ^bb10
          ^bb9:
            %152 = llvm.load %113 : !llvm.ptr -> i64
            %153 = arith.constant 1 : i32
            %155 = arith.extsi %153 : i32 to i64
            %154 = arith.subi %152, %155 : i64
            %156 = llvm.getelementptr %20[%154] : (!llvm.ptr, i64) -> !llvm.ptr, i64
            %151 = llvm.load %156 : !llvm.ptr -> i64
            %157 = llvm.load %85 : !llvm.ptr -> i64
            %158 = arith.muli %37, %151 : i64
            %159 = arith.addi %157, %158 : i64
            %160 = llvm.mlir.addressof @MOD : !llvm.ptr
            %161 = llvm.load %160 : !llvm.ptr -> i64
            %162 = arith.remsi %159, %161 : i64
            llvm.store %162, %85 : i64, !llvm.ptr
            %163 = llvm.load %97 : !llvm.ptr -> i64
            %164 = arith.muli %33, %151 : i64
            %165 = arith.addi %163, %164 : i64
            %166 = llvm.mlir.addressof @MOD : !llvm.ptr
            %167 = llvm.load %166 : !llvm.ptr -> i64
            %168 = arith.remsi %165, %167 : i64
            llvm.store %168, %97 : i64, !llvm.ptr
            %169 = llvm.load %109 : !llvm.ptr -> i64
            %170 = arith.muli %37, %151 : i64
            %171 = arith.addi %169, %170 : i64
            %172 = llvm.mlir.addressof @MOD : !llvm.ptr
            %173 = llvm.load %172 : !llvm.ptr -> i64
            %174 = arith.remsi %171, %173 : i64
            llvm.store %174, %109 : i64, !llvm.ptr
            cf.br ^bb11
          ^bb10:
            cf.br ^bb11
          ^bb11:
          cf.br ^bb8
        ^bb7:
          %176 = llvm.getelementptr %14[%119] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %175 = llvm.load %176 : !llvm.ptr -> i64
          %178 = llvm.getelementptr %2[%119] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %177 = llvm.load %178 : !llvm.ptr -> i64
          %180 = llvm.getelementptr %8[%119] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %179 = llvm.load %180 : !llvm.ptr -> i64
          %181 = llvm.load %85 : !llvm.ptr -> i64
          %182 = arith.muli %50, %120 : i64
          %183 = llvm.mlir.addressof @MOD : !llvm.ptr
          %184 = llvm.load %183 : !llvm.ptr -> i64
          %185 = arith.remsi %182, %184 : i64
          %186 = arith.muli %185, %175 : i64
          %187 = arith.addi %181, %186 : i64
          %188 = llvm.mlir.addressof @MOD : !llvm.ptr
          %189 = llvm.load %188 : !llvm.ptr -> i64
          %190 = arith.remsi %187, %189 : i64
          llvm.store %190, %85 : i64, !llvm.ptr
          %191 = llvm.load %97 : !llvm.ptr -> i64
          %192 = arith.muli %42, %120 : i64
          %193 = llvm.mlir.addressof @MOD : !llvm.ptr
          %194 = llvm.load %193 : !llvm.ptr -> i64
          %195 = arith.remsi %192, %194 : i64
          %196 = arith.muli %195, %177 : i64
          %197 = arith.addi %191, %196 : i64
          %198 = llvm.mlir.addressof @MOD : !llvm.ptr
          %199 = llvm.load %198 : !llvm.ptr -> i64
          %200 = arith.remsi %197, %199 : i64
          llvm.store %200, %97 : i64, !llvm.ptr
          %201 = llvm.load %109 : !llvm.ptr -> i64
          %202 = arith.muli %42, %120 : i64
          %203 = llvm.mlir.addressof @MOD : !llvm.ptr
          %204 = llvm.load %203 : !llvm.ptr -> i64
          %205 = arith.remsi %202, %204 : i64
          %206 = arith.muli %205, %179 : i64
          %207 = arith.addi %201, %206 : i64
          %208 = llvm.mlir.addressof @MOD : !llvm.ptr
          %209 = llvm.load %208 : !llvm.ptr -> i64
          %210 = arith.remsi %207, %209 : i64
          llvm.store %210, %109 : i64, !llvm.ptr
          %211 = llvm.load %113 : !llvm.ptr -> i64
          %212 = arith.constant 3 : i32
          %214 = arith.extsi %212 : i32 to i64
          %213 = arith.cmpi sge, %211, %214 : i64
          cf.cond_br %213, ^bb12, ^bb13
          ^bb12:
            %216 = llvm.load %113 : !llvm.ptr -> i64
            %217 = arith.constant 1 : i32
            %219 = arith.extsi %217 : i32 to i64
            %218 = arith.subi %216, %219 : i64
            %220 = llvm.getelementptr %20[%218] : (!llvm.ptr, i64) -> !llvm.ptr, i64
            %215 = llvm.load %220 : !llvm.ptr -> i64
            %221 = llvm.load %85 : !llvm.ptr -> i64
            %222 = arith.muli %37, %215 : i64
            %223 = llvm.mlir.addressof @MOD : !llvm.ptr
            %224 = llvm.load %223 : !llvm.ptr -> i64
            %225 = arith.remsi %222, %224 : i64
            %226 = arith.muli %225, %175 : i64
            %227 = arith.addi %221, %226 : i64
            %228 = llvm.mlir.addressof @MOD : !llvm.ptr
            %229 = llvm.load %228 : !llvm.ptr -> i64
            %230 = arith.remsi %227, %229 : i64
            llvm.store %230, %85 : i64, !llvm.ptr
            %231 = llvm.load %97 : !llvm.ptr -> i64
            %232 = arith.muli %33, %215 : i64
            %233 = llvm.mlir.addressof @MOD : !llvm.ptr
            %234 = llvm.load %233 : !llvm.ptr -> i64
            %235 = arith.remsi %232, %234 : i64
            %236 = arith.muli %235, %177 : i64
            %237 = arith.addi %231, %236 : i64
            %238 = llvm.mlir.addressof @MOD : !llvm.ptr
            %239 = llvm.load %238 : !llvm.ptr -> i64
            %240 = arith.remsi %237, %239 : i64
            llvm.store %240, %97 : i64, !llvm.ptr
            %241 = llvm.load %109 : !llvm.ptr -> i64
            %242 = arith.muli %33, %215 : i64
            %243 = llvm.mlir.addressof @MOD : !llvm.ptr
            %244 = llvm.load %243 : !llvm.ptr -> i64
            %245 = arith.remsi %242, %244 : i64
            %246 = arith.muli %245, %179 : i64
            %247 = arith.addi %241, %246 : i64
            %248 = llvm.mlir.addressof @MOD : !llvm.ptr
            %249 = llvm.load %248 : !llvm.ptr -> i64
            %250 = arith.remsi %247, %249 : i64
            llvm.store %250, %109 : i64, !llvm.ptr
            cf.br ^bb14
          ^bb13:
            cf.br ^bb14
          ^bb14:
          cf.br ^bb8
        ^bb8:
        %251 = llvm.load %113 : !llvm.ptr -> i64
        %252 = arith.constant 63 : i32
        %254 = arith.extsi %252 : i32 to i64
        %253 = arith.andi %251, %254 : i64
        %255 = arith.constant 0 : i32
        %257 = arith.extsi %255 : i32 to i64
        %256 = arith.cmpi eq, %253, %257 : i64
        cf.cond_br %256, ^bb15, ^bb16
        ^bb15:
          %258 = llvm.load %85 : !llvm.ptr -> i64
          %259 = llvm.mlir.addressof @MOD : !llvm.ptr
          %260 = llvm.load %259 : !llvm.ptr -> i64
          %261 = arith.remsi %258, %260 : i64
          llvm.store %261, %85 : i64, !llvm.ptr
          %262 = llvm.load %97 : !llvm.ptr -> i64
          %263 = llvm.mlir.addressof @MOD : !llvm.ptr
          %264 = llvm.load %263 : !llvm.ptr -> i64
          %265 = arith.remsi %262, %264 : i64
          llvm.store %265, %97 : i64, !llvm.ptr
          %266 = llvm.load %109 : !llvm.ptr -> i64
          %267 = llvm.mlir.addressof @MOD : !llvm.ptr
          %268 = llvm.load %267 : !llvm.ptr -> i64
          %269 = arith.remsi %266, %268 : i64
          llvm.store %269, %109 : i64, !llvm.ptr
          cf.br ^bb17
        ^bb16:
          cf.br ^bb17
        ^bb17:
        %270 = llvm.load %113 : !llvm.ptr -> i64
        %271 = arith.constant 1 : i32
        %273 = arith.extsi %271 : i32 to i64
        %272 = arith.addi %270, %273 : i64
        llvm.store %272, %113 : i64, !llvm.ptr
        cf.br ^bb3
      ^bb5:
      %274 = llvm.load %85 : !llvm.ptr -> i64
      %275 = llvm.mlir.addressof @MOD : !llvm.ptr
      %276 = llvm.load %275 : !llvm.ptr -> i64
      %277 = arith.remsi %274, %276 : i64
      llvm.store %277, %85 : i64, !llvm.ptr
      %278 = llvm.load %97 : !llvm.ptr -> i64
      %279 = llvm.mlir.addressof @MOD : !llvm.ptr
      %280 = llvm.load %279 : !llvm.ptr -> i64
      %281 = arith.remsi %278, %280 : i64
      llvm.store %281, %97 : i64, !llvm.ptr
      %282 = llvm.load %109 : !llvm.ptr -> i64
      %283 = llvm.mlir.addressof @MOD : !llvm.ptr
      %284 = llvm.load %283 : !llvm.ptr -> i64
      %285 = arith.remsi %282, %284 : i64
      llvm.store %285, %109 : i64, !llvm.ptr
      %286 = llvm.load %85 : !llvm.ptr -> i64
      %287 = llvm.load %71 : !llvm.ptr -> i64
      %288 = llvm.getelementptr %14[%287] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %286, %288 : i64, !llvm.ptr
      %289 = llvm.load %97 : !llvm.ptr -> i64
      %290 = llvm.load %71 : !llvm.ptr -> i64
      %291 = llvm.getelementptr %2[%290] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %289, %291 : i64, !llvm.ptr
      %292 = llvm.load %109 : !llvm.ptr -> i64
      %293 = llvm.load %71 : !llvm.ptr -> i64
      %294 = llvm.getelementptr %8[%293] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %292, %294 : i64, !llvm.ptr
      %295 = arith.constant 0 : i32
      %296 = arith.extsi %295 : i32 to i64
      %297 = llvm.mlir.constant(1 : i64) : i64
      %298 = llvm.alloca %297 x i64 : (i64) -> !llvm.ptr
      llvm.store %296, %298 : i64, !llvm.ptr
      %299 = arith.constant 1 : i32
      %300 = arith.extsi %299 : i32 to i64
      %301 = llvm.mlir.constant(1 : i64) : i64
      %302 = llvm.alloca %301 x i64 : (i64) -> !llvm.ptr
      llvm.store %300, %302 : i64, !llvm.ptr
      cf.br ^bb18
      ^bb18:
      %303 = llvm.load %302 : !llvm.ptr -> i64
      %304 = llvm.load %71 : !llvm.ptr -> i64
      %305 = arith.cmpi slt, %303, %304 : i64
      cf.cond_br %305, ^bb19, ^bb20
      ^bb19:
        %306 = llvm.load %298 : !llvm.ptr -> i64
        %308 = llvm.load %302 : !llvm.ptr -> i64
        %309 = llvm.getelementptr %14[%308] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        %307 = llvm.load %309 : !llvm.ptr -> i64
        %311 = llvm.load %71 : !llvm.ptr -> i64
        %312 = llvm.load %302 : !llvm.ptr -> i64
        %313 = arith.subi %311, %312 : i64
        %314 = llvm.getelementptr %14[%313] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        %310 = llvm.load %314 : !llvm.ptr -> i64
        %315 = arith.muli %307, %310 : i64
        %316 = llvm.mlir.addressof @MOD : !llvm.ptr
        %317 = llvm.load %316 : !llvm.ptr -> i64
        %318 = arith.remsi %315, %317 : i64
        %319 = arith.addi %306, %318 : i64
        %320 = llvm.mlir.addressof @MOD : !llvm.ptr
        %321 = llvm.load %320 : !llvm.ptr -> i64
        %322 = arith.remsi %319, %321 : i64
        llvm.store %322, %298 : i64, !llvm.ptr
        %323 = llvm.load %302 : !llvm.ptr -> i64
        %324 = arith.constant 1 : i32
        %326 = arith.extsi %324 : i32 to i64
        %325 = arith.addi %323, %326 : i64
        llvm.store %325, %302 : i64, !llvm.ptr
        cf.br ^bb18
      ^bb20:
      %327 = llvm.load %298 : !llvm.ptr -> i64
      %328 = llvm.load %71 : !llvm.ptr -> i64
      %329 = llvm.getelementptr %20[%328] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %327, %329 : i64, !llvm.ptr
      %331 = llvm.load %71 : !llvm.ptr -> i64
      %332 = arith.constant 1 : i32
      %334 = arith.extsi %332 : i32 to i64
      %333 = arith.subi %331, %334 : i64
      %335 = llvm.getelementptr %26[%333] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %330 = llvm.load %335 : !llvm.ptr -> i64
      %337 = llvm.load %71 : !llvm.ptr -> i64
      %338 = llvm.getelementptr %8[%337] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %336 = llvm.load %338 : !llvm.ptr -> i64
      %339 = arith.addi %330, %336 : i64
      %340 = llvm.mlir.addressof @MOD : !llvm.ptr
      %341 = llvm.load %340 : !llvm.ptr -> i64
      %342 = arith.remsi %339, %341 : i64
      %343 = llvm.load %71 : !llvm.ptr -> i64
      %344 = llvm.getelementptr %26[%343] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %342, %344 : i64, !llvm.ptr
      %345 = llvm.load %71 : !llvm.ptr -> i64
      %346 = arith.constant 1 : i32
      %348 = arith.extsi %346 : i32 to i64
      %347 = arith.addi %345, %348 : i64
      llvm.store %347, %71 : i64, !llvm.ptr
      cf.br ^bb0
    ^bb2:
    %349 = llvm.mlir.addressof @str_0 : !llvm.ptr
    %351 = llvm.getelementptr %26[%1] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    %350 = llvm.load %351 : !llvm.ptr -> i64
    %352 = llvm.mlir.addressof @MOD : !llvm.ptr
    %353 = llvm.load %352 : !llvm.ptr -> i64
    %354 = arith.remsi %350, %353 : i64
    %355 = llvm.call @printf(%349, %354) vararg(!llvm.func<i32 (ptr, ...)>) : (!llvm.ptr, i64) -> i32
    func.call @free(%2) : (!llvm.ptr) -> ()
    func.call @free(%8) : (!llvm.ptr) -> ()
    func.call @free(%14) : (!llvm.ptr) -> ()
    func.call @free(%20) : (!llvm.ptr) -> ()
    func.call @free(%26) : (!llvm.ptr) -> ()
    %361 = arith.constant 0 : i32
    func.return %361 : i32
  }
}