結果
| 問題 | No.3478 XOR-Folding Primes |
| コンテスト | |
| ユーザー |
まぬお
|
| 提出日時 | 2026-03-31 04:29:26 |
| 言語 | PyPy3 (7.3.17) |
| 結果 |
AC
|
| 実行時間 | 2,533 ms / 4,000 ms |
| コード長 | 3,063 bytes |
| 記録 | |
| コンパイル時間 | 129 ms |
| コンパイル使用メモリ | 85,760 KB |
| 実行使用メモリ | 273,988 KB |
| 最終ジャッジ日時 | 2026-03-31 04:29:41 |
| 合計ジャッジ時間 | 13,160 ms |
|
ジャッジサーバーID (参考情報) |
judge1_0 / judge3_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 8 |
ソースコード
from collections import deque, defaultdict, Counter
from bisect import bisect_left, bisect_right
from itertools import permutations, combinations, groupby
from heapq import heappop, heappush
import math, sys
input = lambda: sys.stdin.readline().rstrip("\r\n")
def printl(li, sep=" "): print(sep.join(map(str, li)))
def yn(flag): print(Yes if flag else No)
_int = lambda x: int(x)-1
MOD = 998244353 #10**9+7
INF = 1<<60
Yes, No = "Yes", "No"
class MatrixPow:
def __init__(self, add, zero, mul, one, mat):
h = len(mat)
w = len(mat[0])
assert h == w
self.n = h
self.add = add
self.zero = zero
self.mul = mul
self.one = one
self.mat = self._zeros()
for i in range(self.n):
for j in range(self.n):
self.mat[i][j] = mat[i][j]
def pow(self, k: int):
mat = self._mat()
res = self._identity()
while k != 0:
z = (k&-k).bit_length()-1
for _ in range(z): mat = self._mul_mat(mat, mat)
k >>= z
k -= 1
res = self._mul_mat(res, mat)
return res
def _mat(self):
res = self._zeros()
for i in range(self.n):
for j in range(self.n):
res[i][j] = self.mat[i][j]
return res
def _zeros(self):
return [[self.zero]*self.n for _ in range(self.n)]
def _identity(self):
ret = self._zeros()
for i in range(self.n): ret[i][i] = self.one
return ret
def _mul_mat(self, a, b):
res = self._zeros()
for i in range(self.n):
for j in range(self.n):
s = self.zero
for k in range(self.n): s = self.add(s, self.mul(a[i][k], b[k][j]))
res[i][j] = s
return res
@staticmethod
def mul_mat_vec(mat, vec, add, zero, mul):
n = len(mat)
res = [zero]*n
for i in range(n):
for j in range(n):
res[i] = add(res[i], mul(mat[i][j], vec[j]))
return res
# |a, b| |x| |(a⊗x)⊕(b⊗y)|
# |c, d| |y| = |(c⊗x)⊕(d⊗y)|
def add(a, b): return (a+b)%MOD
zero = 0
def mul(a, b): return (a*b)%MOD
one = 1
def prime(num):
num = int(num)
p = []
if num < 2: return p
p.append(2)
memo = [i%2 for i in range(num+1)]
for i in range(3, num+1, 2):
if memo[i] == 0: continue
p.append(i)
for j in range(i, num+1, i):
memo[j] = 0
return p
L = 10**7
P = prime(L)
pset = set(P)
good = []
for p in P:
if p>>1&1:
q = p^2
if q in pset:
good.append(p)
for _ in range(int(input())):
N, M = map(int, input().split())
if N == 1:
ans = bisect_right(P, M)
else:
good_cnt = bisect_right(good, M)
mat = [[0, 1], [good_cnt*2, 1]]
MAT = MatrixPow(add, zero, mul, one, mat)
mat = MAT.pow(N-1)
vec = [1, good_cnt*2]
ans = sum(MAT.mul_mat_vec(mat, vec, add, zero, mul))%MOD
print(ans)
まぬお