結果
問題 |
No.3205 Range Pairwise Xor Query
|
ユーザー |
![]() |
提出日時 | 2025-07-18 21:36:48 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,600 ms / 2,000 ms |
コード長 | 5,355 bytes |
コンパイル時間 | 426 ms |
コンパイル使用メモリ | 82,288 KB |
実行使用メモリ | 260,880 KB |
最終ジャッジ日時 | 2025-07-18 21:37:11 |
合計ジャッジ時間 | 20,167 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 20 |
ソースコード
############################################################################################ def factorization(n): arr = [] temp = n for i in range(2, int(-(-n**0.5//1))+1): if temp%i==0: cnt=0 while temp%i==0: cnt+=1 temp //= i arr.append([i, cnt]) if temp!=1: arr.append([temp, 1]) if arr==[]: arr.append([n, 1]) return arr def cycle_detection(f, x0): power = lam = 1 first = x0 second = f(x0) while first != second: if power == lam: first = second power *= 2 lam = 0 second = f(second) lam += 1 first = second = x0 for i in range(lam): second = f(second) mu = 0 while first != second: first = f(first) second = f(second) mu += 1 return mu, lam def cycle_detection_lists(f, x0): mu, lam = cycle_detection(f, x0) before_cycle = [0] * mu if mu > 0: before_cycle[0] = x0 for i in range(mu - 1): before_cycle[i + 1] = f(before_cycle[i]) cycle = [0] * lam cycle[0] = before_cycle[-1] if mu > 0 else x0 for i in range(lam - 1): cycle[i + 1] = f(cycle[i]) return before_cycle, cycle import bisect,collections,copy,heapq,itertools,math,string,sys,queue,time,random from decimal import Decimal def I(): return input() def IS(): return input().split() def II(): return int(input()) def IIS(): return list(map(int,input().split())) def LIIS(): return list(map(int,input().split())) def comb(n, r):return math.factorial(n) // (math.factorial(n - r) * math.factorial(r)) def make_divisors(n): lower_divisors , upper_divisors = [], [] i = 1 while i*i <= n: if n % i == 0: lower_divisors.append(i) if i != n // i: upper_divisors.append(n//i) i += 1 return lower_divisors + upper_divisors[::-1] INF=float("inf") MOD=998244353 MOD2=10**9+7 # sys.setrecursionlimit(10**7) alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ" def bit_count(x): return bin(x).count("1") def yesno(f): if f:print("Yes") else:print("No") # import pypyjit # pypyjit.set_param('max_unroll_recursion=-1') def prime_factorization(n): factors = [] temp = n for i in range(2, int(-(-n**0.5//1)) + 1): if temp % i == 0: count = 0 while temp % i == 0: count += 1 temp //= i factors.append((i, count)) if temp != 1: factors.append((temp, 1)) if not factors: factors.append((n, 1)) return factors #n進数表示 def to_base(n, base): if n == 0: return [0] digits = [] while n: digits.append(n % base) n //= base return digits[::-1] class ncr_object: def __init__(self, n, mod=MOD): self.n = n self.mod = mod self.fact = [1] * (n + 1) for i in range(2, n + 1): self.fact[i] = self.fact[i - 1] * i % mod def comb(self, n, r): if n < r or n < 0 or r < 0: return 0 return self.fact[n] * pow(self.fact[r], self.mod - 2, self.mod) * pow(self.fact[n - r], self.mod - 2, self.mod) % self.mod def _ntt(a, invert, mod, root): n = len(a) j = 0 for i in range(1, n): bit = n >> 1 while j & bit: j ^= bit bit >>= 1 j |= bit if i < j: a[i], a[j] = a[j], a[i] length = 2 while length <= n: # wlen = root^((mod-1)/length) mod mod exp = (mod - 1) // length wlen = pow(root, exp, mod) if invert: wlen = pow(wlen, mod - 2, mod) for i in range(0, n, length): w = 1 for k in range(i, i + length // 2): u = a[k] v = a[k + length // 2] * w % mod a[k] = (u + v) % mod a[k + length // 2] = (u - v + mod) % mod w = w * wlen % mod length <<= 1 if invert: inv_n = pow(n, mod - 2, mod) for i in range(n): a[i] = a[i] * inv_n % mod def convolution_ntt(a, b, mod=998244353, root=3): """ Perform convolution of lists a and b under modulus `mod` using NTT. `root` is a primitive root of `mod`, where mod = k*2^m + 1. Returns a list of size len(a)+len(b)-1, results mod `mod`. """ n = 1 while n < len(a) + len(b) - 1: n <<= 1 fa = a + [0] * (n - len(a)) fb = b + [0] * (n - len(b)) _ntt(fa, invert=False, mod=mod, root=root) _ntt(fb, invert=False, mod=mod, root=root) for i in range(n): fa[i] = fa[i] * fb[i] % mod _ntt(fa, invert=True, mod=mod, root=root) return fa[:len(a) + len(b) - 1] # print(convolution_ntt([1, 2, 3], [4, 5, 6], mod=998244353, root=3)) # pragma GCC target("avx2") # pragma GCC optimize("O3") # pragma GCC optimize("unroll-loops") from fractions import Fraction as fraction #################################################### n,q=IIS() A=LIIS() li=[[0] for i in range(28)] for i in range(28): for j in range(n): li[i].append(li[i][-1]+(((1<<i)&A[j])>0)) for _ in range(q): l,r=IIS() ans=0 for i in range(28): ans+=(li[i][r]-li[i][l-1])*(r-l+1-(li[i][r]-li[i][l-1]))*(1<<i) print(ans)