Blitz Round #25 C - Root Value
正の整数 に対して、 が自然数になるような最大の を とします。
長さ の数列 () と 個のクエリ が与えられるので、各クエリについて
を求める問題です。
- 、テストケースの の総和と の総和はそれぞれ 以下
正確な問題文は元の問題ページを見てください。
を素因数分解して とすると、 が整数になるのは、すべての指数 が の倍数のときです。したがって
です。 なので、積は 以上になり、指数のどれかは正になります。
積をそのまま計算すると巨大になりますが、指数だけを見れば足し算になります。 なので、現れる素数は 以下の 個だけです。各素数について指数の累積和を持っておけば、区間 での各素数の指数は差を取るだけで求まり、その が答えです。
の上限を ()、 以下の素数の個数を () とすると、計算量は です。
Python
from math import gcdprime = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]
for _ in range(int(input())): N, Q = map(int, input().split()) A = list(map(int, input().split())) acc = [[0] * len(prime)] for a in A: t = acc[-1].copy() for i, p in enumerate(prime): while a % p == 0: t[i] += 1 a //= p acc.append(t) for _ in range(Q): l, r = map(int, input().split()) l -= 1 ans = 0 for i in range(len(prime)): ans = gcd(ans, acc[r][i] - acc[l][i]) print(ans)