結果

問題 No.3721 Absurd Basic Constructive
コンテスト
ユーザー occhan
提出日時 2026-09-19 13:37:32
言語 JavaScript
(node v26.7.0 + ACL)
コンパイル:
true
実行:
node _filename_ ONLINE_JUDGE
結果
AC  
実行時間 140 ms / 2,000 ms
+ 856µs
コード長 23,781 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 56 ms
コンパイル使用メモリ 6,528 KB
実行使用メモリ 126,336 KB
最終ジャッジ日時 2026-09-19 13:37:46
合計ジャッジ時間 9,934 ms
ジャッジサーバーID
(参考情報)
judge1_1 / judge4_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 47
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

"use strict";
// start
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
Object.defineProperty(exports, "__esModule", { value: true });
const fs = __importStar(require("node:fs"));
function main() {
    // ここに処理を記述します
    let [N, K] = nextNums(2);
    if (K == 0) {
        print(-1);
        return;
    }
    let ans = [];
    let cnt = N * N;
    for (let i = 1; i <= N; i++) {
        ans.push([]);
        if ((cnt - K) >= N - 1) {
            ans[i - 1].push(i * N);
            for (let j = 1; j < N; j++) {
                ans[i - 1].push(i * N - j);
            }
            cnt -= N - 1;
        }
        else {
            if (cnt == K) {
                for (let j = 1; j <= N; j++) {
                    ans[i - 1].push((i - 1) * N + j);
                }
            }
            else {
                for (let j = cnt - K + 1; j <= N; j++) {
                    ans[i - 1].push((i - 1) * N + j);
                }
                for (let j = 1; j < cnt - K + 1; j++) {
                    ans[i - 1].push((i - 1) * N + j);
                }
                cnt = K;
            }
        }
    }
    if (cnt > K) {
        let k = 0;
        for (let i = cnt - K + 1; i <= N; i++) {
            ans[k++][0] = i * N;
        }
        for (let i = 1; i < cnt - K + 1; i++) {
            ans[k++][0] = i * N;
        }
    }
    for (let i = 0; i < N; i++) {
        if (i < N - 1)
            println(ans[i], " ");
        else
            print(ans[i], " ");
    }
    // 処理終了
}
const less = (a, b) => (a == b ? 0 : a < b ? -1 : 1);
const greater = (a, b) => (a == b ? 0 : a < b ? 1 : -1);
const bigIntMax = (...args) => args.reduce((m, e) => (e > m ? e : m));
const bigIntMin = (...args) => args.reduce((m, e) => (e < m ? e : m));
const bigIntAbs = (arg) => (arg < 0 ? -arg : arg);
/**
 * 説明: 非負 bigint n の床平方根 floor(sqrt(n)) を正確に返す。
 * 使い方: let x = bigIntSqrt(n)
 * 計算量: O(log bit長)
 */
const bigIntSqrt = (n) => {
    if (n < 0n) {
        throw new RangeError("square root of negative bigint");
    }
    if (n < 2n)
        return n;
    let bitLength = n.toString(2).length;
    let x = 1n << BigInt((bitLength + 1) >> 1);
    while (true) {
        let next = (x + n / x) >> 1n;
        if (next >= x)
            return x;
        x = next;
    }
};
let inputs = "";
let inputArray;
let currentIndex = 0;
let outputBuffer = "";
let yes = "Yes";
let no = "No";
let MOD998244353 = 998244353;
let small_a_code = 97;
let big_A_code = 65;
let dxy4 = [[-1, 0], [0, 1], [1, 0], [0, -1]];
let dxy8 = [[-1, 0], [-1, 1], [0, 1], [1, 1], [1, 0], [1, -1], [0, -1], [-1, -1]];
let dir4 = ["U", "R", "D", "L"];
// // インタラクティブ用
// // お決まりのインプットはコメントアウト、main関数にasyncを忘れない
// // 詳しくは典型ABC305-Fをチェック
// const readline = require("readline");
// const rl = readline.createInterface({
//   input: process.stdin,
//   output: process.stdout,
// });
// const it = rl[Symbol.asyncIterator]();
// const nextAwait = async () => {
//   const { value } = await it.next();
//   return value.trim();
// };
function next() {
    return inputArray[currentIndex++];
}
function nextNum() {
    return +next();
}
function nextBigInt() {
    return BigInt(next());
}
function nexts(length) {
    const arr = [];
    for (let i = 0; i < length; ++i)
        arr[i] = next();
    return arr;
}
function nextNums(length) {
    const arr = [];
    for (let i = 0; i < length; ++i)
        arr[i] = nextNum();
    return arr;
}
function nextBigInts(length) {
    const arr = [];
    for (let i = 0; i < length; ++i)
        arr[i] = nextBigInt();
    return arr;
}
function print(out, separator) {
    if (Array.isArray(out)) {
        outputBuffer += out.join(separator);
    }
    else {
        outputBuffer += out;
    }
}
function println(out, separator) {
    if (Array.isArray(out)) {
        print(out, separator || "");
    }
    else {
        print(out);
    }
    print("\n");
}
function flush() {
    if (outputBuffer.length == 0)
        return;
    console.log(outputBuffer.endsWith("\n")
        ? outputBuffer.slice(0, -1)
        : outputBuffer);
}
function intDiv(a, b) {
    return Math.trunc(a / b);
}
function lowerBound(list, value, less = (l, r) => l < r) {
    let count = list.length;
    let first = 0;
    while (0 < count) {
        const count2 = count / 2 | 0;
        const mid = first + count2;
        if (less(list[mid], value)) {
            first = mid + 1;
            count -= count2 + 1;
        }
        else {
            count = count2;
        }
    }
    return first;
}
function upperBound(list, value, less = (l, r) => l < r) {
    return lowerBound(list, value, (l, r) => !less(r, l));
}
function nextPermutation(arr) {
    const len = arr.length;
    let left = len - 2;
    while (left >= 0 && arr[left] >= arr[left + 1]) {
        left--;
    }
    if (left < 0) {
        return false;
    }
    let right = len - 1;
    while (arr[left] >= arr[right]) {
        right--;
    }
    const t = arr[left];
    arr[left] = arr[right];
    arr[right] = t;
    left++;
    right = len - 1;
    while (left < right) {
        const t = arr[left];
        arr[left] = arr[right];
        arr[right] = t;
        left++;
        right--;
    }
    return true;
}
function gcd(a, b) {
    if (b == 0 || b == BigInt(0)) {
        return a;
    }
    if (typeof a === 'number' && typeof b === 'number') {
        const r = a % b;
        return gcd(b, r);
    }
    else if (typeof a === 'bigint' && typeof b === 'bigint') {
        const r = a % b;
        return gcd(b, r);
    }
    return 0;
}
function lcm(a, b) {
    if (a == 0n || b == 0n)
        return 0n;
    return a / gcd(a, b) * b;
}
/**
 * ax+by=gcd(|a|,|b|)
 * を満たす [g,x,y] を返す
 */
function extGcdBigInt(a, b) {
    let signA = a < 0n ? -1n : 1n;
    let signB = b < 0n ? -1n : 1n;
    a = bigIntAbs(a);
    b = bigIntAbs(b);
    let oldR = a;
    let r = b;
    let oldX = 1n;
    let x = 0n;
    let oldY = 0n;
    let y = 1n;
    while (r != 0n) {
        let q = oldR / r;
        [oldR, r] = [
            r,
            oldR - q * r
        ];
        [oldX, x] = [
            x,
            oldX - q * x
        ];
        [oldY, y] = [
            y,
            oldY - q * y
        ];
    }
    return [
        oldR,
        oldX * signA,
        oldY * signB
    ];
}
function eratosthenesPrime(N = 10 ** 6) {
    if (N < 2)
        return [];
    let b = Array(N + 1).fill(true);
    b[0] = false;
    b[1] = false;
    let prime = [2];
    for (let i = 4; i <= N; i += 2) {
        b[i] = false;
    }
    for (let i = 3; i <= N; i += 2) {
        if (b[i]) {
            prime.push(i);
            for (let j = i * i; j <= N; j += i * 2) {
                b[j] = false;
            }
        }
    }
    return prime;
}
// ソートなし約数列挙
function enumDiv(n) {
    const res = [];
    for (let i = 1; i * i <= n; i++) {
        if (n % i == 0) {
            res.push(i);
            if (i * i != n)
                res.push(intDiv(n, i));
        }
    }
    return res;
}
function useModint(M) {
    /*
     * 0 <= a,b < M, M < 2^30 のとき高速な mod 乗算。
     *
     * a*b 自体は MAX_SAFE_INTEGER を超えることがあるが、
     * q=floor(a*b/M) は誤差が高々ごく小さいため
     * 真の商との差は高々1。
     *
     * Math.imul で積の下位32bitを正確に求め、
     * 最後の差が (-M,2M) に収まることを利用して
     * 正確な余りを復元する。
     */
    let mulMod;
    if (M < (1 << 30)) {
        mulMod = (a, b) => {
            let q = Math.floor(a * b / M);
            let r = (Math.imul(a, b) - Math.imul(q, M)) | 0;
            if (r < 0)
                r += M;
            else if (r >= M)
                r -= M;
            return r;
        };
    }
    else {
        // 従来版
        mulMod = (a, b) => {
            let t = a * b;
            if (t <= Number.MAX_SAFE_INTEGER)
                return t % M;
            return ((((a >> 16) * b) % M) * 65536 + (a & 65535) * b) % M;
        };
    }
    /*
     * add/sub は通常、
     * 両方とも既に [0,M) に正規化されているため
     * % を使わず1回の補正で済む。
     *
     * 範囲外の値が渡された場合だけ % にフォールバックする。
     */
    Number.prototype.add = function (a) {
        let t = +this + a;
        if (0 <= t && t < M)
            return t;
        if (M <= t && t < 2 * M)
            return t - M;
        if (-M <= t && t < 0)
            return t + M;
        t %= M;
        return t < 0 ? t + M : t;
    };
    Number.prototype.sub = function (a) {
        let t = +this - a;
        if (0 <= t && t < M)
            return t;
        if (M <= t && t < 2 * M)
            return t - M;
        if (-M <= t && t < 0)
            return t + M;
        t %= M;
        return t < 0 ? t + M : t;
    };
    Number.prototype.mul = function (a) {
        return mulMod(+this, a);
    };
    /*
     * pow 内では x.mul(x) とせず、
     * mulMod を直接呼ぶ。
     *
     * public API は a.pow(n) のままだが、
     * 内部では Number.prototype 経由の呼び出しを避ける。
     */
    Number.prototype.pow = function (n) {
        let x = +this;
        x %= M;
        if (x < 0)
            x += M;
        let r = 1;
        if (typeof n == "number") {
            if (!Number.isSafeInteger(n) || n < 0) {
                throw new RangeError("exponent must be a non-negative safe integer");
            }
            while (n > 0) {
                if (n % 2 == 1)
                    r = mulMod(r, x);
                x = mulMod(x, x);
                n = Math.floor(n / 2);
            }
        }
        else {
            if (n < 0n) {
                throw new RangeError("exponent must be non-negative");
            }
            while (n > 0n) {
                if (n & 1n)
                    r = mulMod(r, x);
                x = mulMod(x, x);
                n >>= 1n;
            }
        }
        return r;
    };
    Number.prototype.div = function (a) {
        let x = a % M;
        if (x < 0)
            x += M;
        let n = M - 2;
        let r = 1;
        while (n > 0) {
            if (n % 2 == 1)
                r = mulMod(r, x);
            x = mulMod(x, x);
            n = Math.floor(n / 2);
        }
        return mulMod(+this, r);
    };
}
/**
 * 説明:
 *   Number.MAX_SAFE_INTEGER を超える可能性がある積を
 *   正確に MOD で割った余りにする。
 *   0 <= a < 2^31 を前提とする。
 *
 * 使い方:
 *   let x = modMul(a,b,MOD);
 *
 * 計算量:
 *   O(1)
 */
function modMul(a, b, MOD) {
    let t = a * b;
    if (t <= Number.MAX_SAFE_INTEGER) {
        return t % MOD;
    }
    return ((((a >> 16) * b) % MOD) * 65536 + (a & 65535) * b) % MOD;
}
function bigint_mod_pow(x, n, p) {
    if (n < 0n) {
        throw new RangeError("exponent must be non-negative");
    }
    if (p <= 0n) {
        throw new RangeError("modulus must be positive");
    }
    x %= p;
    if (x < 0n)
        x += p;
    let r = 1n % p;
    for (; n; x = x * x % p, n >>= 1n) {
        if (n & 1n)
            r = r * x % p;
    }
    return r;
}
const U64_BASE = 4294967296;
const U64_MASK_BIGINT = 0xffffffffn;
const U64_LIMIT_BIGINT = 1n << 64n;
/**
 * bigint -> U64
 * 計算量 O(1)
 */
function u64FromBigInt(x) {
    if (x < 0n || x >= U64_LIMIT_BIGINT) {
        throw new RangeError("u64FromBigInt: out of uint64 range");
    }
    return [
        Number(x >> 32n),
        Number(x & U64_MASK_BIGINT)
    ];
}
/**
 * safe integer number -> U64
 * 計算量 O(1)
 */
function u64FromNumber(x) {
    if (!Number.isSafeInteger(x) || x < 0) {
        throw new RangeError("u64FromNumber: x must be a non-negative safe integer");
    }
    return [
        Math.floor(x / U64_BASE) >>> 0,
        x >>> 0
    ];
}
/**
 * U64 -> bigint
 *
 * 出力時など、低頻度で使うことを想定。
 * 計算量 O(1)
 *
 * 用例: ABC391-F
 */
function u64ToBigInt(hi, lo) {
    return ((BigInt(hi >>> 0) << 32n)
        + BigInt(lo >>> 0));
}
/**
 * U64 -> number
 *
 * Number.MAX_SAFE_INTEGER 以下でなければ例外。
 * 計算量 O(1)
 */
function u64ToNumber(hi, lo) {
    let x = (hi >>> 0) * U64_BASE + (lo >>> 0);
    if (!Number.isSafeInteger(x)) {
        throw new RangeError("u64ToNumber: value exceeds safe integer range");
    }
    return x;
}
/**
 * unsigned 64bit 比較
 *
 * 戻り値:
 *   a < b : -1
 *   a = b :  0
 *   a > b :  1
 *
 * 計算量 O(1)
 *
 * 用例: ABC391-F
 */
function u64Cmp(ah, al, bh, bl) {
    ah >>>= 0;
    al >>>= 0;
    bh >>>= 0;
    bl >>>= 0;
    if (ah != bh)
        return ah < bh ? -1 : 1;
    if (al != bl)
        return al < bl ? -1 : 1;
    return 0;
}
/**
 * unsigned 64bit 等値判定
 */
function u64Eq(ah, al, bh, bl) {
    return ((ah >>> 0) == (bh >>> 0)
        &&
            (al >>> 0) == (bl >>> 0));
}
/**
 * unsigned 64bit 加算
 *
 * 2^64 を超えた分は捨てる。
 * 計算量 O(1)
 */
function u64Add(ah, al, bh, bl) {
    ah >>>= 0;
    al >>>= 0;
    bh >>>= 0;
    bl >>>= 0;
    let sumLo = al + bl;
    let lo = sumLo >>> 0;
    let hi = (ah
        + bh
        + (sumLo >= U64_BASE ? 1 : 0)) >>> 0;
    return [hi, lo];
}
/**
 * unsigned 64bit 減算
 *
 * a >= b を想定。
 * a < b の場合は 2^64 を法としてwrapする。
 * 計算量 O(1)
 */
function u64Sub(ah, al, bh, bl) {
    ah >>>= 0;
    al >>>= 0;
    bh >>>= 0;
    bl >>>= 0;
    let borrow = al < bl ? 1 : 0;
    let lo = (al - bl) >>> 0;
    let hi = (ah - bh - borrow) >>> 0;
    return [hi, lo];
}
/**
 * unsigned 64bit XOR
 * 計算量 O(1)
 */
function u64Xor(ah, al, bh, bl) {
    return [
        (ah ^ bh) >>> 0,
        (al ^ bl) >>> 0
    ];
}
/**
 * uint32 * uint32 を正確な uint64 にする。
 *
 * a,b は 0 <= a,b < 2^32。
 *
 * JavaScript number で a*b を直接計算すると
 * 2^53 を超えて整数精度を失う可能性があるため、
 * 16bit ずつに分割して計算する。
 *
 * 計算量 O(1)
 *
 * 用例: ABC391-F
 */
function u64MulU32(a, b) {
    a >>>= 0;
    b >>>= 0;
    let a0 = a & 0xffff;
    let a1 = a >>> 16;
    let b0 = b & 0xffff;
    let b1 = b >>> 16;
    let mid = a1 * b0 + a0 * b1;
    let t = a0 * b0
        + (mid & 0xffff) * 65536;
    let lo = t >>> 0;
    let hi = (a1 * b1
        + Math.floor(mid / 65536)
        + Math.floor(t / U64_BASE)) >>> 0;
    return [hi, lo];
}
/**
 * U64 + uint32*uint32
 *
 * 積を別途BigIntにせず加算する。
 * 計算量 O(1)
 */
function u64AddMulU32(hi, lo, a, b) {
    a >>>= 0;
    b >>>= 0;
    let a0 = a & 0xffff;
    let a1 = a >>> 16;
    let b0 = b & 0xffff;
    let b1 = b >>> 16;
    let mid = a1 * b0 + a0 * b1;
    let t = a0 * b0
        + (mid & 0xffff) * 65536;
    let mlo = t >>> 0;
    let mhi = (a1 * b1
        + Math.floor(mid / 65536)
        + Math.floor(t / U64_BASE)) >>> 0;
    let sumLo = (lo >>> 0) + mlo;
    return [
        ((hi >>> 0)
            + mhi
            + (sumLo >= U64_BASE ? 1 : 0)) >>> 0,
        sumLo >>> 0
    ];
}
// ========================================
// U64 Hash Set
// ========================================
// 説明:
//   Set<bigint> が重い場合に使う。
//   open addressing + linear probing。
//
//   hi,lo を Uint32Array に保存し、
//   used を Uint8Array で管理する。
//
// 使い方:
//   let set = new U64HashSet(4_300_000);
//   set.add(hi,lo);
//   set.has(hi,lo);
//   set.size;
//
// 計算量:
//   平均 add/has O(1)
//
// 注意:
//   expectedSize を大きく超えて追加しないこと。
class U64HashSet {
    cap;
    mask;
    hi;
    lo;
    used;
    _size = 0;
    constructor(expectedSize = 16) {
        let cap = 1;
        // load factor をおよそ 0.7 以下にする
        while (cap * 0.7 < expectedSize) {
            cap *= 2;
        }
        this.cap = cap;
        this.mask = cap - 1;
        this.hi = new Uint32Array(cap);
        this.lo = new Uint32Array(cap);
        this.used = new Uint8Array(cap);
    }
    get size() {
        return this._size;
    }
    hash(h, l) {
        h >>>= 0;
        l >>>= 0;
        let x = (Math.imul((l ^ (l >>> 16)) >>> 0, 0x85ebca6b)
            ^
                Math.imul((h ^ (h >>> 16)) >>> 0, 0xc2b2ae35)) >>> 0;
        x ^= x >>> 16;
        return x >>> 0;
    }
    has(h, l) {
        h >>>= 0;
        l >>>= 0;
        let p = this.hash(h, l) & this.mask;
        while (this.used[p]) {
            if (this.hi[p] == h
                &&
                    this.lo[p] == l) {
                return true;
            }
            p = (p + 1) & this.mask;
        }
        return false;
    }
    /**
     * 新しく追加されたならtrue、
     * すでに存在していたならfalse。
     */
    add(h, l) {
        h >>>= 0;
        l >>>= 0;
        let p = this.hash(h, l) & this.mask;
        while (this.used[p]) {
            if (this.hi[p] == h
                &&
                    this.lo[p] == l) {
                return false;
            }
            p = (p + 1) & this.mask;
        }
        this.used[p] = 1;
        this.hi[p] = h;
        this.lo[p] = l;
        this._size++;
        return true;
    }
}
// ========================================
// Large Exact Sum
// ========================================
// 説明:
//   1回ごとの加算値は safe integer だが、
//   累積結果だけ Number.MAX_SAFE_INTEGER を超える場合に使う。
//
//   例:
//     ABC384-G の答え累積など。
//
//   内部表現:
//     value = hi * 1e9 + lo
//
//   add() 内ではBigIntを使わず、
//   最後に toBigInt() したときだけBigIntを使う。
//
// 注意:
//   hi 自体が safe integer を超えない範囲を想定。
//   通常のAtCoder 1e18〜1e21程度なら十分。
class LargeIntSum {
    static BASE = 1e9;
    hi = 0;
    lo = 0;
    constructor(initial = 0) {
        this.add(initial);
    }
    /**
     * safe integer を加算する。
     * 負数も可。
     */
    add(x) {
        if (!Number.isSafeInteger(x)) {
            throw new RangeError("LargeIntSum.add: x must be a safe integer");
        }
        this.lo += x;
        let q = Math.trunc(this.lo / LargeIntSum.BASE);
        this.hi += q;
        this.lo -= q * LargeIntSum.BASE;
    }
    sub(x) {
        this.add(-x);
    }
    /**
     * 最後の出力時などに使用。
     */
    toBigInt() {
        return (BigInt(this.hi)
            * 1000000000n
            + BigInt(this.lo));
    }
    /**
     * safe integer 範囲なら number を返す。
     */
    toNumber() {
        let x = this.hi * LargeIntSum.BASE
            + this.lo;
        if (!Number.isSafeInteger(x)) {
            throw new RangeError("LargeIntSum.toNumber: value exceeds safe integer range");
        }
        return x;
    }
}
/**
 * 説明: 階乗と逆階乗を前計算し、nCr/nPr/nHr を高速に計算する。useModint(MOD) 後に使う。
 * 使い方: let comb = new CombMod(MAX); comb.nCr(n,r)
 * 計算量: 前計算 O(MAX)、各クエリ O(1)
 */
class CombMod {
    fac;
    finv;
    /**
     * @param max_n 求める最大の N を指定
     */
    /**
     * 説明: 階乗・逆階乗を max_n まで前計算する
     * 使い方: new CombMod(max_n)
     * 計算量: O(max_n)
     */
    constructor(max_n) {
        // max_n が 0 や 1 の場合でもエラーにならないよう、最低サイズ2を確保
        let size = Math.max(2, max_n + 1);
        this.fac = new Float64Array(size);
        this.finv = new Float64Array(size);
        this.fac[0] = 1;
        this.fac[1] = 1;
        this.finv[0] = 1;
        this.finv[1] = 1;
        // 階乗の計算
        for (let i = 2; i <= max_n; i++) {
            this.fac[i] = this.fac[i - 1].mul(i);
        }
        // 逆元の計算 (一番大きいところだけ .div() を使い、あとは掛け算で降下する最速手法)
        if (max_n >= 2) {
            this.finv[max_n] = (1).div(this.fac[max_n]);
            for (let i = max_n - 1; i >= 2; i--) {
                this.finv[i] = this.finv[i + 1].mul(i + 1);
            }
        }
    }
    /**
     * 説明: 組み合わせ nCr を返す
     * 使い方: comb.nCr(n,r)
     * 計算量: O(1)
     */
    nCr(n, r) {
        if (n < r || n < 0 || r < 0)
            return 0;
        return this.fac[n].mul(this.finv[r]).mul(this.finv[n - r]);
    }
    /**
     * 説明: 順列 nPr を返す
     * 使い方: comb.nPr(n,r)
     * 計算量: O(1)
     */
    nPr(n, r) {
        if (n < r || n < 0 || r < 0)
            return 0;
        return this.fac[n].mul(this.finv[n - r]);
    }
    /**
     * 説明: 重複組合せ nHr を返す
     * 使い方: comb.nHr(n,r)
     * 計算量: O(1)
     */
    nHr(n, r) {
        if (n < 0 || r < 0)
            return 0;
        if (n == 0 && r == 0)
            return 1;
        return this.nCr(n + r - 1, r);
    }
}
/**
 * 説明: 最長増加部分列の長さを返す。狭義増加
 * 使い方: let len = LIS(A)
 * 計算量: O(N log N)
 */
function LIS(arr) {
    let dp = [];
    for (let num of arr) {
        let lb = lowerBound(dp, num);
        if (lb == dp.length) {
            dp.push(num);
        }
        else {
            dp[lb] = num;
        }
    }
    return dp.length;
}
// end
function readInput() {
    const g = globalThis;
    // Deno
    if (typeof g.Deno !== "undefined") {
        const chunks = [];
        const buf = new Uint8Array(1 << 16);
        while (true) {
            const n = g.Deno.stdin.readSync(buf);
            if (n === null)
                break;
            if (n > 0)
                chunks.push(buf.slice(0, n));
        }
        const length = chunks.reduce((s, c) => s + c.length, 0);
        const bytes = new Uint8Array(length);
        let offset = 0;
        for (const c of chunks) {
            bytes.set(c, offset);
            offset += c.length;
        }
        return new TextDecoder().decode(bytes);
    }
    // Node.js / Bun
    return fs.readFileSync(0, "utf8");
}
inputs = readInput();
inputArray = inputs.trim().split(/\s+/);
main();
flush();
/**
 * https://github.com/occhanCode/atcoder-templates/blob/main/src/main.ts
 */ 
//# sourceMappingURL=main.js.map
0