Rezolvare completă PbInfo #1469 ConcursInfo

Cerința

Ana şi Andreea s-au provocat la un concurs de “Info”. Fiecare îi dă celeilalte o problemă de informatică să o rezolve, în final stabilindu-se cîştigătoarea. Pentru această întrecere ele au la dispoziţie trei numere, a, b şi c cu care să formuleze câte două întrebări. Iată care sunt întrebările:
Ana: -Care sunt cele mai mari trei cifre ale lui b?
Andreea: -Cât este suma numerelor divizibile cu c, care sunt cuprinse strict între a şi b?
Ana: -Câte numere cuprinse strict între a şi b au în scrierea lor binară exact trei cifre egale cu 1?
Andreea: -Află două numere diferite d şi e, cu d < e şi d minim, cuprinse strict între a şi b, pentru care diferenţa dintre produsul şi suma lor este egală cu b.
După acest maraton informatic, Ana şi Andreea speră să obţină fiecare câte 100 de puncte, bineînţeles cu ajutorul vostru. Succes!

Date de intrare

Fișierul de intrare concursinfo.in conține pe prima linie numerele naturale a, b, c şi cod despărţite prin spaţiu.

Date de ieșire

Fișierul de ieșire concursinfo.out va conține pe prima linie:

  • pentru cod=1, cele mai mari trei cifre ale lui b, în ordine crescătoare, despărţite prin spaţiu;
  • pentru cod=2, suma numerelor divizibile cu c, care sunt cuprinse strict între a şi b (dacă nu există asemenea numere se va afişa 0);
  • pentru cod=3, numărul numerelor cuprinse strict între a şi b care au exact trei cifre egale cu 1 în scrierea lor binară (dacă nu există se va afişa 0);
  • pentru cod=4, două numere d şi e, cu d < e şi d minim, scrise în ordine crescătoare, care sunt cuprinse strict între a şi b şi pentru care diferenţa dintre produsul şi suma lor este egală cu b ( dacă nu există aceste numere se va afişa 0 0).

Restricții și precizări

  • 1 ≤ a < b ≤ 1.000.000.000
  • 1 ≤ c < b
  • b are cel puţin 3 cifre
  • pentru cod=1 se pot obţine 16p, iar pentru cod egal cu 2, 3 sau 4 câte 28p

Exemplul 1:

concursinfo.in

3 110 10 1

concursinfo.out

0 1 1

Exemplul 2:

concursinfo.in

3 110 10 2

concursinfo.out

550

Exemplul 3:

concursinfo.in

3 110 10 3

concursinfo.out

34

Exemplul 4:

concursinfo.in

3 110 10 4

concursinfo.out

4 38

Explicație

Din fişierul de intrare se citesc a=3, b=110, c=10 şi cod.

  • pentru cod=1, cele mai mari 3 cifre ale lui b, scrise în ordine crescătoare, sunt 0 1 1.
  • pentru cod=2, numerele cuprinse între 3 şi 110 care sunt divizibile cu 10 sunt 10,20,30,...,100, iar suma lor este 550.
  • pentru cod=3, numerele cuprinse între 3 şi 110 care au exact trei cifre egale cu 1 în scrierea binară sunt 7, 11, 13, 14, 19,...,88, 104 în total fiind 34 de numere.
  • pntru cod=4, avem a < 4 < 38 < b şi 4•38-(4+38)=110=b.

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 ConcursInfo:

#include <fstream>

using namespace std;
ifstream f("concursinfo.in");
ofstream g("concursinfo.out");
long long a , b , c , x , max1 , max2 , max3 , cif , y , p , q , r , nr , gasit , i, t , cod ;

int main()
{
    f >> a >> b >> c >> cod ;
    if ( cod == 1 )
    {
    //cele mai mari trei cifre ale lui b
    x = b ;
    max1 = -1 ;
    max2 = -1 ;
    max3 = -1 ;
    while ( x!=0 )
    {
        cif = x % 10 ;
        if ( cif >= max1 ) { t = max1 ; max1 = cif ; max3 = max2 ; max2 = t ;}
        else if ( cif >= max2 ) { max3 = max2 ; max2 = cif ; }
             else if ( cif >= max3 ) max3 = cif ;
        x = x / 10 ;
    }
    g << max3 << " " << max2 << " " << max1 ;
    }
    if ( cod == 2 )
    {
    //suma numerelor cuprinse intre a si b, divizibile cu c
    if ( a % c == 0 ) x = (a + c)/c ;
    else x =  a/c + 1 ;

    if ( b % c == 0 ) y = (b - c)/c ;
    else y =  b/c ;

    if ( x <= y ) g << c * ( y*(y+1)/2 - x*(x-1)/2) ;
    else g << 0 ;
    }
    if ( cod == 3 )
    {
    //cate numere cuprinse intre a si b au 3 cifre egale cu 1 in scrierea binara
    nr = 0 ;
    for ( p=1 ; p*7<b ; p=p*2 )
      for ( q=p*2 ; p+q<b ; q=q*2 )
        for ( r=q*2 ; p+q+r<b ; r=r*2 )
            if (( p+q+r>a)&&(p+q+r<b)) nr++ ;
    g << nr ;
    }
    if ( cod == 4 )
    {
    //numere ce au diferenta dintre produs si suma egala cu b
    gasit = 0 ;
    for( i=1 ; ((i*i<=(b+1))&&(gasit==0)) ; i++ )
      if (( (b+1)%i==0 )&&( i+1>a )&&( (b+1)/i+1<b)) gasit = 1 ;
    i-- ;
    if( gasit==1) g << i+1 << " " << (b+1)/i+1 ;
    else g<< 0 << " " << 0 ;
    }
    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 #1469 ConcursInfo

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1469 ConcursInfo 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!