有多少独特元素的子序列是可能的?
How many sub-sequences of unique elements can be possible?
我有一个整数序列[A1, A2, A3.....AN]
我正在尝试计算最多包含 K 个唯一数字的所有子序列。
例如:
给定序列:: [2, 3, 3, 7, 5]
和 K = 3
所有子序列为:
[],
[2],[3],[3],[7],[5],
[2, 3],[2, 3],[2, 7],[2, 5],[3, 3],[3, 7],[3, 5],[3, 7],[3, 5],[7, 5],
[2, 3, 3],[2, 3, 7],[2, 3, 5],[2, 3, 7],[2, 3, 5],[2, 7, 5],[3, 3, 7],[3, 3, 5],[3, 7, 5],[3, 7, 5],
[2, 3, 3, 7],[2, 3, 3, 5],[2, 3, 7, 5],[2, 3, 7, 5],[3, 3, 7, 5],
[2, 3, 3, 7, 5]
我需要所有具有唯一元素的子序列(仅用于计数)。
✅ 计数的子序列是:
[],
[2],[3],[3],[7],[5],
[2, 3],[2, 3],[2, 7],[2, 5],[3, 7],[3, 5],[3, 7],[3, 5],[7, 5],
[2, 3, 7],[2, 3, 5],[2, 3, 7],[2, 3, 5],[2, 7, 5],[3, 7, 5],[3, 7, 5]
总计 = 22
⛔ 未计算的子序列是:
[3, 3],
[2, 3, 3],[3, 3, 7],[3, 3, 5]
⛔ 忽略更长的长度:length > K
(如果 k = 5
然后忽略重复元素):
[2, 3, 3, 7],[2, 3, 3, 5],[3, 3, 7, 5],
[2, 3, 3, 7, 5]
[ N.B: 所有的子序列都不是唯一的,但它们的元素(数量)应该相同。 Ex- [2, 3],[2, 3] 都被计算但 [3, 3] 被忽略 ]
::代码::
import itertools as it
import sys, math
n, m = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
cnt = 0
for i in range(2, m+1):
for val in it.combinations(a, i):
if len(set(val)) == i:
cnt += 1
print(1+n+cnt)
输入:
5 3
2 3 3 7 5
输出:22
✔
但是我需要一个有效的解决方案,也许是使用nCr
等的数学解决方案或程序解决方案。
限制条件:
1 <= K <= N <= 1,000,00
1 <= Ai <= 9,000
时间: 1 sec
您的 help/trying 帮助将不胜感激。
感谢阅读
试试这个:
import itertools
def findsubsets(s, n):
return list(itertools.combinations(s, n))
my_list = [2, 3, 3, 7, 5]
list_len = 0
for i in range(1,len(my_list)):
list_len += len(set(findsubsets(my_list, i)))
print(list_len)
输出:
22
编辑:
从列表中删除具有相同数字的排列:
import itertools
def findsubsets(s, n):
return list(list(x) for x in itertools.combinations(s, n))
my_list = [2, 3, 7, 5, 3]
list_len = 0
for i in range(1,len(my_list)):
list_len += len(set(tuple(sorted(i)) for i in findsubsets(my_list, i)))
print(list_len)
输出:
22
试试这个:
import numpy as np
mod = 1000000007
n, k = map(int, input().split())
a = list(map(int, input().split()))
fre = [0]*10000
A = []
for i in range(0, n):
fre[a[i]] += 1
for i in range(0, 9001):
if fre[i] > 0:
A.append(fre[i])
kk = min( len( A ), k ) + 1
S = np.zeros( kk, dtype=int ); S[0] = 1
for a in A:
S[1:kk] = (S[1:kk] + (a * S[0:kk-1])% mod) % mod
ans = 0
for s in S:
ans = ((ans + s) % mod)
print(ans)
此程序return所有具有唯一元素的子序列(仅用于计数)。
我有一个整数序列[A1, A2, A3.....AN]
我正在尝试计算最多包含 K 个唯一数字的所有子序列。
例如:
给定序列:: [2, 3, 3, 7, 5]
和 K = 3
所有子序列为:
[],
[2],[3],[3],[7],[5],
[2, 3],[2, 3],[2, 7],[2, 5],[3, 3],[3, 7],[3, 5],[3, 7],[3, 5],[7, 5],
[2, 3, 3],[2, 3, 7],[2, 3, 5],[2, 3, 7],[2, 3, 5],[2, 7, 5],[3, 3, 7],[3, 3, 5],[3, 7, 5],[3, 7, 5],
[2, 3, 3, 7],[2, 3, 3, 5],[2, 3, 7, 5],[2, 3, 7, 5],[3, 3, 7, 5],
[2, 3, 3, 7, 5]
我需要所有具有唯一元素的子序列(仅用于计数)。
✅ 计数的子序列是:
[],
[2],[3],[3],[7],[5],
[2, 3],[2, 3],[2, 7],[2, 5],[3, 7],[3, 5],[3, 7],[3, 5],[7, 5],
[2, 3, 7],[2, 3, 5],[2, 3, 7],[2, 3, 5],[2, 7, 5],[3, 7, 5],[3, 7, 5]
总计 = 22
⛔ 未计算的子序列是:
[3, 3],
[2, 3, 3],[3, 3, 7],[3, 3, 5]
⛔ 忽略更长的长度:length > K
(如果 k = 5
然后忽略重复元素):
[2, 3, 3, 7],[2, 3, 3, 5],[3, 3, 7, 5],
[2, 3, 3, 7, 5]
[ N.B: 所有的子序列都不是唯一的,但它们的元素(数量)应该相同。 Ex- [2, 3],[2, 3] 都被计算但 [3, 3] 被忽略 ]
::代码::
import itertools as it
import sys, math
n, m = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
cnt = 0
for i in range(2, m+1):
for val in it.combinations(a, i):
if len(set(val)) == i:
cnt += 1
print(1+n+cnt)
输入:
5 3
2 3 3 7 5
输出:22
✔
但是我需要一个有效的解决方案,也许是使用nCr
等的数学解决方案或程序解决方案。
限制条件:
1 <= K <= N <= 1,000,00
1 <= Ai <= 9,000
时间: 1 sec
您的 help/trying 帮助将不胜感激。
感谢阅读
试试这个:
import itertools
def findsubsets(s, n):
return list(itertools.combinations(s, n))
my_list = [2, 3, 3, 7, 5]
list_len = 0
for i in range(1,len(my_list)):
list_len += len(set(findsubsets(my_list, i)))
print(list_len)
输出:
22
编辑: 从列表中删除具有相同数字的排列:
import itertools
def findsubsets(s, n):
return list(list(x) for x in itertools.combinations(s, n))
my_list = [2, 3, 7, 5, 3]
list_len = 0
for i in range(1,len(my_list)):
list_len += len(set(tuple(sorted(i)) for i in findsubsets(my_list, i)))
print(list_len)
输出:
22
试试这个:
import numpy as np
mod = 1000000007
n, k = map(int, input().split())
a = list(map(int, input().split()))
fre = [0]*10000
A = []
for i in range(0, n):
fre[a[i]] += 1
for i in range(0, 9001):
if fre[i] > 0:
A.append(fre[i])
kk = min( len( A ), k ) + 1
S = np.zeros( kk, dtype=int ); S[0] = 1
for a in A:
S[1:kk] = (S[1:kk] + (a * S[0:kk-1])% mod) % mod
ans = 0
for s in S:
ans = ((ans + s) % mod)
print(ans)
此程序return所有具有唯一元素的子序列(仅用于计数)。