📅  最后修改于: 2023-12-03 14:50:25.678000             🧑  作者: Mango
给定一个长度为N的正整数序列,求其中包含不同素数的子序列个数,且子序列长度不超过K。
这道题需要用到数学中的容斥原理。我们以包含2、3、5三个素数为例:
最后将上述的结果相加,就是所求的答案。
以下是Python 3实现的代码片段:
def get_primes(n):
"""
返回一个n以内的素数列表
"""
is_prime = [True] * n
primes = []
for i in range(2, n):
if is_prime[i]:
primes.append(i)
for j in range(i*i, n, i):
is_prime[j] = False
return primes
def count_subsequences(n, k):
primes = get_primes(k+1) # 获取小于等于k的素数列表
res = 0
# 计算包含不同素数的子序列个数
for i in range(1, 1 << len(primes)):
prod = 1
for j in range(len(primes)):
if i & (1 << j):
prod *= primes[j]
cnt = n // prod
if cnt == 0:
continue
if bin(i).count("1") % 2 == 0:
res -= cnt
else:
res += cnt
# 计算长度不超过k的子序列个数
for i in range(1, k+1):
prod = 1
for prime in primes:
prod *= prime ** min(i, k // prime)
res += (n // prod) * ((-1) ** (i+1))
return res
其中,get_primes
函数用于获取小于等于$k$的素数列表,count_subsequences
函数用于计算包含不同素数的、长度不超过$k$的子序列个数。