Rezolvare completă PbInfo #1595 Bomboane1

Cerința

Lui Cristian, ca oricărui alt copil, îi plac bomboanele. A primit cadou de la prietenii lui cutii cu bomboane. Fiind multe cutii le-a numerotat: 1, 2, 3, … Desfăcând câteva, a văzut că există o legătură între numărul de pe etichetă și numărul de bomboane din cutie. Astfel în fiecare cutie sunt atâtea bomboane câți divizori pari are numărul de pe cutie. De exemplu cutia cu numărul 10 conține 2 bomboane, cutia cu numărul 8 conține 3 bomboane ș.a.m.d.

Cristian a ales la întâmplare două etichete x și y dorind să desfacă toate cutiile cu etichete cuprinse între x și y. Ajutați-l să determine prima cutie, etichetată cu a, și utima cutie, etichetată cu b, cu număr maxim de bomboane (x≤a≤b≤y), câte cutii n sunt cu acest număr de bomboane și care este acest număr d de bomboane.

Date de intrare

Fișierul de intrare bomboane1.in conține pe prima linie numerele naturale nenule x și y separate prin câte un spațiu.

Date de ieșire

Fișierul de ieșire bomboane1.out va conține o singură linie pe care vor fi scrise cele patru valori determinate, în ordinea din cerință (a b n d), separate prin câte un spațiu.

Restricții și precizări

  • 1 ≤ x ≤ a ≤ b ≤ y ≤ 1.000.000.000
  • y - x ≤ 1000

Exemplu

bomboane1.in

10 20

bomboane1.out

12 20 3 4

Explicație

Dacă parcurgem toate numerele de la 10 la 20 constatăm că numărul maxim de divizori pari este 4 obținut la numerele 12, 16 şi 20 (3 numere).

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Bomboane1:

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("bomboane1.in");
ofstream g("bomboane1.out");
int main()
{
    int d1, x, y, d=-1, b ,a, n;
    int k = 0;
    f >> x >> y;
    if(x%2==1)
        x++;
    for(int i=x;i<=y;i+=2)
    {
        k = 0;
        int d2 = 0;
        int m = i;
        while(m%2 == 0)
        {
            m /= 2;
            d2++;
        }
        for(d1=1; d1*d1<m; d1+=2)
            if(m % d1 == 0)
                k +=2;
        if(d1 * d1 == m)
            k ++;
        k *= d2;

        if(k>d)
        {
            d = k;
            a = b = i;
            n = 1;
        }
        else
            if(k == d)
            {
                b = i;
                n++;
            }

    }
    g << a << ' ' << b << ' ' << n << ' ' << d;


    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1595 Bomboane1

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1595 Bomboane1 de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!