AcWing 1454. 异或和是质数的子集数
原题链接
中等
作者:
KillerQueen
,
2020-05-12 11:40:33
,
所有人可见
,
阅读 1146
#异或和是质数的子集数01背包 f(前i个数 异或和是j)
# M > j ^ A[i - 1] 时才选 A[i - 1]
#滚动数组 后面加 & 1
#最后判断j 是不是质数
M = 2**13
MOD = 1e9 + 7
def is_prime(x):
for i in range(2, x):
if x % i == 0:
return False
return True
if __name__ == '__main__':
n = int(input())
A = list(map(int, input().split()))
dp = [[0] * M for _ in range(2)]
dp[0][0] = 1
for i in range(1, n + 1):
for j in range(M):
dp[i & 1][j] = dp[i - 1 & 1][j]
if M > j ^ A[i - 1]:
dp[i & 1][j] = (dp[i & 1][j] + dp[i - 1 & 1][j ^ A[i - 1]]) % MOD
res = 0
for j in range(2, M):
if is_prime(j):
res = (res + dp[n & 1][j]) % MOD
print(int(res))
可以改为一维的吗,我不会改。。
不能改。必须二维