from math import comb
from fractions import Fraction
def sieve( n) :
"""Hàm tạo danh sách boolean is_prime[0..n] với is_prime[i] True nếu i là số nguyên tố."""
is_prime = [ True ] * ( n + 1 )
is_prime[ 0 ] = is_prime[ 1 ] = False
for i in range ( 2 , int ( n**0.5 ) + 1 ) :
if is_prime[ i] :
for j in range ( i*i, n + 1 , i) :
is_prime[ j] = False
return is_prime
def main( ) :
N = 2025
# Tạo danh sách các số lẻ và số chẵn từ 1 đến 2025
odds = list ( range ( 1 , N + 1 , 2 ) )
evens = list ( range ( 2 , N + 1 , 2 ) )
# Tổng lớn nhất có thể: 2025 (số lẻ lớn nhất) + 2024 (số chẵn lớn nhất) = 4049
max_sum = 4049
is_prime_list = sieve( max_sum)
# Đếm số cặp (o,e) với o trong odds, e trong evens sao cho tổng là số nguyên tố.
count_prime_pairs = 0
for o in odds:
for e in evens:
if is_prime_list[ o + e] :
count_prime_pairs += 1
# Tổng số cặp chọn được là C(2025,2)
total_pairs = comb( N, 2 )
# Xác suất là tỉ số giữa số cặp có tổng nguyên tố và tổng số cặp.
probability = count_prime_pairs / total_pairs
# In kết quả dưới dạng phân số tối giản và số thực.
print ( "Số cặp (số lẻ, số chẵn) cho tổng là số nguyên tố:" , count_prime_pairs)
print ( "Tổng số cặp chọn được:" , total_pairs)
print ( "Xác suất (dạng số thực):" , probability)
print ( "Xác suất (dạng phân số tối giản):" , Fraction( count_prime_pairs, total_pairs) )
if __name__ == '__main__' :
main( )
ZnJvbSBtYXRoIGltcG9ydCBjb21iCmZyb20gZnJhY3Rpb25zIGltcG9ydCBGcmFjdGlvbgoKZGVmIHNpZXZlKG4pOgogICAgIiIiSMOgbSB04bqhbyBkYW5oIHPDoWNoIGJvb2xlYW4gaXNfcHJpbWVbMC4ubl0gduG7m2kgaXNfcHJpbWVbaV0gVHJ1ZSBu4bq/dSBpIGzDoCBz4buRIG5ndXnDqm4gdOG7kS4iIiIKICAgIGlzX3ByaW1lID0gW1RydWVdICogKG4gKyAxKQogICAgaXNfcHJpbWVbMF0gPSBpc19wcmltZVsxXSA9IEZhbHNlCiAgICBmb3IgaSBpbiByYW5nZSgyLCBpbnQobioqMC41KSArIDEpOgogICAgICAgIGlmIGlzX3ByaW1lW2ldOgogICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpKmksIG4gKyAxLCBpKToKICAgICAgICAgICAgICAgIGlzX3ByaW1lW2pdID0gRmFsc2UKICAgIHJldHVybiBpc19wcmltZQoKZGVmIG1haW4oKToKICAgIE4gPSAyMDI1CiAgICAjIFThuqFvIGRhbmggc8OhY2ggY8OhYyBz4buRIGzhursgdsOgIHPhu5EgY2jhurVuIHThu6sgMSDEkeG6v24gMjAyNQogICAgb2RkcyA9IGxpc3QocmFuZ2UoMSwgTiArIDEsIDIpKQogICAgZXZlbnMgPSBsaXN0KHJhbmdlKDIsIE4gKyAxLCAyKSkKICAgIAogICAgIyBU4buVbmcgbOG7m24gbmjhuqV0IGPDsyB0aOG7gzogMjAyNSAoc+G7kSBs4bq7IGzhu5tuIG5o4bqldCkgKyAyMDI0IChz4buRIGNo4bq1biBs4bubbiBuaOG6pXQpID0gNDA0OQogICAgbWF4X3N1bSA9IDQwNDkKICAgIGlzX3ByaW1lX2xpc3QgPSBzaWV2ZShtYXhfc3VtKQogICAgCiAgICAjIMSQ4bq/bSBz4buRIGPhurdwIChvLGUpIHbhu5tpIG8gdHJvbmcgb2RkcywgZSB0cm9uZyBldmVucyBzYW8gY2hvIHThu5VuZyBsw6Agc+G7kSBuZ3V5w6puIHThu5EuCiAgICBjb3VudF9wcmltZV9wYWlycyA9IDAKICAgIGZvciBvIGluIG9kZHM6CiAgICAgICAgZm9yIGUgaW4gZXZlbnM6CiAgICAgICAgICAgIGlmIGlzX3ByaW1lX2xpc3RbbyArIGVdOgogICAgICAgICAgICAgICAgY291bnRfcHJpbWVfcGFpcnMgKz0gMQogICAgCiAgICAjIFThu5VuZyBz4buRIGPhurdwIGNo4buNbiDEkcaw4bujYyBsw6AgQygyMDI1LDIpCiAgICB0b3RhbF9wYWlycyA9IGNvbWIoTiwgMikKICAgIAogICAgIyBYw6FjIHN14bqldCBsw6AgdOG7iSBz4buRIGdp4buvYSBz4buRIGPhurdwIGPDsyB04buVbmcgbmd1ecOqbiB04buRIHbDoCB04buVbmcgc+G7kSBj4bq3cC4KICAgIHByb2JhYmlsaXR5ID0gY291bnRfcHJpbWVfcGFpcnMgLyB0b3RhbF9wYWlycwogICAgCiAgICAjIEluIGvhur90IHF14bqjIGTGsOG7m2kgZOG6oW5nIHBow6JuIHPhu5EgdOG7kWkgZ2nhuqNuIHbDoCBz4buRIHRo4buxYy4KICAgIHByaW50KCJT4buRIGPhurdwIChz4buRIGzhurssIHPhu5EgY2jhurVuKSBjaG8gdOG7lW5nIGzDoCBz4buRIG5ndXnDqm4gdOG7kToiLCBjb3VudF9wcmltZV9wYWlycykKICAgIHByaW50KCJU4buVbmcgc+G7kSBj4bq3cCBjaOG7jW4gxJHGsOG7o2M6IiwgdG90YWxfcGFpcnMpCiAgICBwcmludCgiWMOhYyBzdeG6pXQgKGThuqFuZyBz4buRIHRo4buxYyk6IiwgcHJvYmFiaWxpdHkpCiAgICBwcmludCgiWMOhYyBzdeG6pXQgKGThuqFuZyBwaMOibiBz4buRIHThu5FpIGdp4bqjbik6IiwgRnJhY3Rpb24oY291bnRfcHJpbWVfcGFpcnMsIHRvdGFsX3BhaXJzKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBtYWluKCkK