結果
問題 |
No.2758 RDQ
|
ユーザー |
|
提出日時 | 2025-06-09 00:03:52 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 425 ms / 2,000 ms |
コード長 | 2,711 bytes |
コンパイル時間 | 603 ms |
コンパイル使用メモリ | 82,336 KB |
実行使用メモリ | 214,144 KB |
最終ジャッジ日時 | 2025-06-09 00:04:02 |
合計ジャッジ時間 | 9,389 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
from sys import stdin,setrecursionlimit#,set_int_max_str_digits #import pypyjit #pypyjit.set_param('max_unroll_recursion=-1') setrecursionlimit(20000000) # これこどふぉだと無理 #set_int_max_str_digits(200010) mod = 998244353 ii = lambda :int(stdin.readline()) mi = lambda :map(int,stdin.readline().split()) li = lambda :list(mi()) gmi = lambda :map(lambda x: int(x) - 1, stdin.readline().split()) gi = lambda :list(map(lambda x: 0 if x == "." else 1,input())) # グリッド入力受け取り py = lambda :print("Yes") pn = lambda :print("No") pf = lambda :print("First") ps = lambda :print("Second") vec = [(1,0),(-1,0),(0,-1),(0,1)] vec1 = [(1,0),(1,1),(0,1),(-1,1),(-1,0),(-1,-1),(0,-1),(1,-1)] #8方向 inf = 2*10**18 from collections import defaultdict,deque from heapq import heappop,heappush n,q = mi() a = li() M = max(a) N = M+1 # 適当な値を入れる、WAが出るなら脳死で10**6とかを入れた方がいい p_data = [-1]*(N+1) # 素数なら 1、素数でないなら最大の素因数 p_list = [] # 素数のリストを返す for i in range(2,N+1): if p_data[i] == -1: p_data[i] = 1 p_list.append(i) for j in range(2*i,N+1,i): p_data[j] = i def p_fac(x): # 素因数分解、O(logx) if x == 1: return [1] ret = [] while p_data[x] != 1: ret.append(p_data[x]) x //= p_data[x] ret.append(x) return ret[::-1] # verified # https://atcoder.jp/contests/abc393/submissions/62865195 def enumerate_divisors(x): if x == 1: return [1] pre = -1 memo = [] while p_data[x] != 1: if pre == p_data[x]: memo[-1][-1] += 1 else: memo.append([p_data[x],1]) pre = p_data[x] x //= p_data[x] if x == pre: memo[-1][-1] += 1 else: memo.append([x,1]) ret = [1] for u,v in memo: k = len(ret) tmp = 1 for _ in range(v): tmp *= u for i in range(k): ret.append(ret[i]*tmp) return ret memo = [[] for _ in range(M+2)] for i,x in enumerate(a,1): c = enumerate_divisors(x) for v in c[1::]: memo[v].append(i) for _ in range(q): l,r,k = mi() if k == 1: print(r-l+1) continue a = memo[k] ok = -1 ng = len(a) while abs(ok-ng) > 1: mid = (ok+ng)//2 if a[mid] < l: ok = mid else: ng = mid tmp = ok ok = -1 ng = len(a) while abs(ok-ng) > 1: mid = (ok+ng)//2 if a[mid] <= r: ok = mid else: ng = mid print(ok-tmp)