Giả sử chúng ta có một số n, chúng ta phải tìm xác suất để bất kỳ ước số thích hợp nào của n sẽ là một hình vuông chẵn hoàn hảo.
Vì vậy, nếu đầu vào là n =36, thì đầu ra sẽ là 1/8 vì có tám ước số thích hợp của 36, chúng là {1,2,3,4,6,9,12,18} và trong số đó chỉ có một số (4) là hình vuông hoàn hảo và chẵn.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- nếu n mod 4 không giống 0, thì
- trả về 0
- nếu không,
- nc:=n, ptr:=2
- l:=một danh sách mới
- while ptr <=căn bậc hai của nc, do
- a:=0
- trong khi nc mod ptr giống 0, do
- a:=a + 1
- nc:=tầng của (nc / ptr)
- nếu a> 0, thì
- thêm a vào danh sách l
- ptr:=ptr + 1
- nếu nc> 1, thì nối 1 vào danh sách l
- k:=l [0]
- d:=k + 1
- no:=tầng của (k / 2)
- đối với mỗi i trong l [từ chỉ mục 1 đến cuối], thực hiện
- d:=d * (i + 1)
- no:=no * tầng của (i / 2) + 1
- d:=d - 1
- nếu n là một hình vuông hoàn hảo thì
- không:=không - 1
- g:=gcd của d và không
- d:=tầng của d / g
- no:=tầng không / g
- nếu không giống với 0, thì
- trả về 0
- nếu không,
- trả về một phân số không có / d
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
from math import gcd
def solve(n):
if n % 4 != 0:
return 0
else:
nc = n
ptr = 2
l = []
while ptr <= nc ** 0.5:
a = 0
while nc % ptr == 0:
a += 1
nc = nc / ptr
if a > 0:
l += [a]
ptr += 1
if nc > 1:
l += [1]
k = l[0]
d = k + 1
no = int(k / 2)
for i in l[1:]:
d = d * (i + 1)
no *= int(i / 2) + 1
d = d - 1
if int(n ** 0.5) ** 2 == n:
no -= 1
g = gcd(d, no)
d = d // g
no = no // g
if no == 0:
return 0
else:
return str(no) + '/' + str(d)
n = 36
print(solve(n)) Đầu vào
4, 27
Đầu ra
1/8