3676 - ABK1K2

De la Universitas MediaWiki

Cerința

Se dau patru numere naturale a, b, k1, k2. Determinați numărul de submulțimi formate din două elemente numere naturale x și y, cu x și y cuprinse între a și b, astfel încât cel mai mare divizor comun al lui x și y să fie multiplu de k1 sau multiplu de k2.

Date de intrare

Fișierul de intrare conține patru numere, câte unul pe rând, în ordine: a, b, k1, k2 cu semnificația de mai sus.

Date de ieșire

În fișierul de ieșire se va scrie pe prima linie valoarea cerută.

Restricții și precizări

  • a și b sunt cuprinse între 1 și inclusiv 109, a ≤ b.
  • k1 și k2 sunt cuprinse între 2 și 109 inclusiv.
  • perechile pentru care avem x = y nu se numără.

Exemplul 1

abk1k2.in
4
10
2
4
abk1k2.out
6

Explicație

Submulțimile care se numără sunt: 4, 6 4, 8 4, 10 6, 8 6, 10 8, 10.

Exemplul 2

abk1k2.in
10
20
3
abk1k2.out
Date invalide: Nu sunt suficiente date in fisierul de intrare

Rezolvare

#3676 abk1k2
from math import gcd

def verificare_date_intrare(a, b, k1, k2):
  # Verificăm dacă a și b sunt în intervalul specificat
  if not (1 <= a <= b <= 10**9):
    return False
  
  # Verificăm dacă k1 și k2 sunt în intervalul specificat
  if not (2 <= k1 <= 10**9 and 2 <= k2 <= 10**9):
    return False
  
  return True

def numar_submultimi(a, b, k1, k2):
  if not verificare_date_intrare(a, b, k1, k2):
    return "Date invalide: Parametrii introdusi sunt incorecti."
  
  count = 0
  for x in range(a, b + 1):
    for y in range(x + 1, b + 1):
      if gcd(x, y) % k1 == 0 or gcd(x, y) % k2 == 0:
        count += 1
  return count

def main():
  # Citim datele de intrare
  with open("abk1k2.in", "r") as f:
    linii = f.readlines()
  
  # Eliminăm liniile goale și spațiile suplimentare
  linii = [linie.strip() for linie in linii if linie.strip()]
  
  # Verificăm dacă avem suficiente linii pentru a extrage datele
  if len(linii) != 4:
    # Scriem mesaj de date invalide în fișierul de ieșire
    with open("abk1k2.out", "w") as f:
      f.write("Date invalide: Nu sunt suficiente date in fisierul de intrare")
    return
  
  # Extragem datele de intrare
  a = int(linii[0])
  b = int(linii[1])
  k1 = int(linii[2])
  k2 = int(linii[3])
  
  # Calculăm numărul de submulțimi dorit
  rezultat = numar_submultimi(a, b, k1, k2)
  
  # Scriem rezultatul în fișierul de ieșire
  with open("abk1k2.out", "w") as f:
    f.write(str(rezultat))

if __name__ == "__main__":
  main()