Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
Đáp án+Giải thích các bước giải:
giải thích đề :
+) bạn được cho 1 số nguyên dương n.
+) xét tất cả tập con được gọi là hợp lệ nếu không có hai phần tử nào trong tập đó mà tổng của chúng là một số chính phương (ví dụ: 1, 4, 9, 16, 25...)
Ý tưởng:
+)dùng bitmask biểu diễn tập con đang chọn
+)Nếu chọn phần tử i, ta cần đảm bảo không có phần tử nào đã chọn sao cho tổng là số chính phương.
+)Sử dụng @lru_cache để memo hóa tránh tính lại.
đoạn code, mình tự viết bạn tham khảo:
import math
from functools import lru_cache
n, m = map(int, input().split())
a = set(i*i for i in range(1, int(2*n**0.5)+1))
b = [[False]*(n+1) for _ in range(n+1)]
for i in range(1, n+1):
for j in range(i+1, n+1):
if i + j in a:
b[i][j] = b[j][i] = True
@lru_cache(maxsize=None)
def dfs(i, mask):
if i > n:
return 1
res = dfs(i+1, mask)
for j in range(1, i):
if (mask >> (j-1)) & 1 and b[i][j]:
return res
res += dfs(i+1, mask | (1 << (i-1)))
return res % m
print(dfs(1, 0))
-----không hiểu thì cứ hỏi mình nha-------
**chúc bạn học tốt**
Hãy giúp mọi người biết câu trả lời này thế nào?
def is_perfect_square(n):
"""Kiểm tra xem một số có phải là số chính phương hay không."""
if n < 0:
return False
if n == 0:
return True
x = int(n**0.5)
return x*x == n
def solve():
n, m = map(int, input().split())
count = 0
for i in range(2**(n)):
subset = []
for j in range(n):
if (i >> j) & 1:
subset.append(j + 1)
is_fset = True
for u_index in range(len(subset)):
for v_index in range(u_index + 1, len(subset)):
u = subset[u_index]
v = subset[v_index]
if is_perfect_square(u * v):
is_fset = False
break
if not is_fset:
break
if is_fset:
count += 1
print(count % m)
solve()
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin
98
538
49
chẳng quan trọng , chỉ muốn giúp đỡ người khác thôi
98
538
49
còn bn có nghĩ gì sau khi hạ thấp người khác để làm cho mình trở nên ngầu hơn :) ?
98
538
49
nếu bn làm được thì cũng không phải ở đây mà nhắn lung tung