-
Notifications
You must be signed in to change notification settings - Fork 0
/
2572. 无平方子集计数.py
67 lines (59 loc) · 1.49 KB
/
2572. 无平方子集计数.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# -*- coding: utf-8 -*-
# author: caoji
# datetime: 2023-02-20 21:48
# ide: PyCharm
import collections
import copy
# leetcode submit region begin(Prohibit modification and deletion)
from sortedcontainers import SortedList
prims = [1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
mod = 10 ** 9 + 7
m = {
1: 0,
2: (1 << 0),
3: (1 << 1),
5: (1 << 2),
6: (1 << 0) | (1 << 1),
7: (1 << 3),
10: (1 << 0) | (1 << 2),
11: (1 << 4),
13: (1 << 5),
14: (1 << 0) | (1 << 3),
15: (1 << 1) | (1 << 2),
17: (1 << 6),
19: (1 << 7),
21: (1 << 1) | (1 << 3),
22: (1 << 0) | (1 << 4),
23: (1 << 8),
26: (1 << 0) | (1 << 5),
29: (1 << 9),
30: (1 << 0) | (1 << 1) | (1 << 2)
}
from typing import List
class Solution:
def squareFreeSubsets(self, nums: List[int]) -> int:
ans = 0
c = collections.defaultdict(int)
lst = []
for num in nums:
if num in m:
lst.append(m[num])
for i, num in enumerate(lst):
tmp = collections.defaultdict(int)
for k, v in c.items():
if k & num == 0:
tmp[k | num] += v
ans += v
tmp[num] += 1
ans += 1
ans %= mod
for k, v in c.items():
tmp[k] += v
c = tmp
return ans
# leetcode submit region end(Prohibit modification and deletion)
print(
Solution().squareFreeSubsets(
[17,27,20,1,19]
)
)