import sys #input = sys.stdin.readline input = sys.stdin.buffer.readline #文字列はダメ #sys.setrecursionlimit(1000000) #import bisect #import itertools #import random #from heapq import heapify, heappop, heappush #from collections import defaultdict #from collections import deque #import copy #import math #from functools import lru_cache #@lru_cache(maxsize=None) #MOD = pow(10,9) + 7 MOD = 998244353 #dx = [1,0,-1,0] #dy = [0,1,0,-1] import random def prime_factorize(n): ret = [] #if n == 1: # ret.append((1,1)) # return ret cnt = 0 while n % 2 == 0: cnt += 1 n //= 2 if cnt > 0: ret.append((2,cnt)) i = 3 while i * i <= n: cnt = 0 while n % i == 0: cnt += 1 n //= i else: if cnt != 0: #cnt==0の時は追加しない ret.append((i,cnt)) i += 2 if n != 1: ret.append((n,1)) return ret #(素因数、何乗) def get_root(p): #p-1の素因数 L = prime_factorize(p-1) #p-1の素因数pi全てに対してa^((p-1)/pi) != 1であることを確かめる。 while True: a = random.randint(2,p-1) #2 <= a <= p-1 for pi, dummy in L: x = (p-1)//pi if pow(a,x,p) == 1: break else: return a rt = 3 #原始根rtとしたときのn乗根.rt^MOD-1 = 1なので肩をnで割ればよい。 def pr(n): return pow(rt, (MOD-1)//n, MOD) def convolution(a,b): #3は998244353の原始根. 3^998244352 = 1 #998244352 = 2^23 * 7 * 17 d = len(a) + len(b) - 1 #畳み込むうえで必要な長さ #2^nで始めてd以上となるn n = 1 while (1<