# PBinfo #1469 – ConcursInfo – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

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.

## Cod sursă C++

```cpp
#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;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1469)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1469/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1469/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
