結果
| 問題 | No.3277 Forever Monotonic Number | 
| コンテスト | |
| ユーザー | 👑 | 
| 提出日時 | 2025-09-08 21:58:53 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 1,405 ms / 4,000 ms | 
| コード長 | 1,885 bytes | 
| コンパイル時間 | 497 ms | 
| コンパイル使用メモリ | 82,256 KB | 
| 実行使用メモリ | 164,148 KB | 
| 最終ジャッジ日時 | 2025-09-10 01:13:03 | 
| 合計ジャッジ時間 | 14,439 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 | 
| other | AC * 9 | 
ソースコード
from bisect import bisect_left
def is_monotonic(n: int) -> bool:
    """整数 n が monotonic か判定する"""
    str_n = str(n)
    for i in range(len(str_n) - 1):
        if int(str_n[i]) > int(str_n[i + 1]):
            return False
    return True
def digit_sum(n: int) -> int:
    """整数 n の桁和"""
    str_n = str(n)
    return sum(int(i) for i in str_n)
def forever_monotonics(L: int) -> list[int]:
    """10**L 未満の forever-monotonic な整数を列挙する"""
    is_fm = [False] * (L * 9 + 1)
    for i in range(L * 9 + 1):
        if i <= 9 or (is_monotonic(i) and is_fm[digit_sum(i)]):
            is_fm[i] = True
    # mono_list[d][i] : 最上位が i となる d 桁の monotonic な整数の配列
    mono_list = [[[] for _ in range(10)] for _ in range(L)]
    mono_list[0] = [[i] for i in range(10)]
    # fm_list : forever-monotonic な整数を昇順に列挙した配列
    fm_list = [i for i in range(1, 10)]
    for d in range(1, L):
        for i in range(1, 10):
            for j in range(i, 10):
                for mono in mono_list[d - 1][j]:
                    next_mono = i * (10**d) + mono
                    mono_list[d][i].append(next_mono)
                    if is_fm[digit_sum(next_mono)]:
                        fm_list.append(next_mono)
    return fm_list
# 10**15 未満の forever-monotonic な整数を列挙
fm_list = forever_monotonics(15)
P = 998244353
inv_9 = pow(9, P - 2, P)
def solve():
    N = int(input())
    digit = fm_list[bisect_left(fm_list, N + 1)]
    div = (digit - (N + 1)) // 8
    rem = (digit - (N + 1)) % 8
    ans = (pow(10, N + 1, P) - 1) * inv_9 % P
    ans += (pow(10, div + 1, P) - 1) * rem * inv_9 % P
    ans += (pow(10, div, P) - 1) * (8 - rem) * inv_9 % P
    ans %= P
    print(ans)
if __name__ == "__main__":
    T = int(input())
    for _ in range(T):
        solve()
            
            
            
        