{.hints:off checks:off warnings:off assertions:on optimization:speed.} import algorithm, sequtils, tables, macros, math, sets, strutils, strformat, sugar when defined(MYDEBUG): import header import streams proc scanf(formatstr: cstring){.header: "", varargs.} #proc getchar(): char {.header: "", varargs.} proc nextInt(): int = scanf("%lld",addr result) proc nextFloat(): float = scanf("%lf",addr result) proc nextString[F](f:F): string = var get = false result = "" while true: # let c = getchar() let c = f.readChar if c.int > ' '.int: get = true result.add(c) elif get: return proc nextInt[F](f:F): int = parseInt(f.nextString) proc nextFloat[F](f:F): float = parseFloat(f.nextString) proc nextString():string = stdin.nextString() #{{{ gcd and inverse proc gcd(a,b:int):int= if b == 0: return a else: return gcd(b,a mod b) proc lcm(a,b:int):int= return a div gcd(a, b) * b # a x + b y = gcd(a, b) proc extGcd(a,b:int, x,y:var int):int = var g = a x = 1 y = 0 if b != 0: g = extGcd(b, a mod b, y, x) y -= (a div b) * x return g; proc invMod(a,m:int):int = var x,y:int if extGcd(a, m, x, y) == 1: return (x + m) mod m else: return 0 # unsolvable #}}} proc modLog(a, b, p:int):int = var g = 1 i = p b = b while i > 0: g = (g * a) mod p i = i div 2 g = gcd(g, p) var t = 1 c = 0 while t mod g > 0: if t == b: return c t = (t * a) mod p c += 1 if b mod g > 0: return -1 t = t div g b = b div g var n = p div g h = 0 gs = 1 while h * h < n: gs = (gs * a) mod n h += 1 var bs = initTable[int,int]() s = 0 e = b while s < h: e = (e * a) mod n s += 1 bs[e] = s s = 0 e = t while s < n: e = (e * gs) mod n s += h if e in bs: return c + s - bs[e] return -1 let T = nextInt() for _ in 0..