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 luib
, în ordine crescătoare, despărţite prin spaţiu; - pentru
cod=2
, suma numerelor divizibile cuc
, care sunt cuprinse strict întrea
şib
(dacă nu există asemenea numere se va afişa0
); - pentru
cod=3
, numărul numerelor cuprinse strict întrea
şib
care au exact trei cifre egale cu1
în scrierea lor binară (dacă nu există se va afişa0
); - pentru
cod=4
, două numered
şie
, cud < e
şid
minim, scrise în ordine crescătoare, care sunt cuprinse strict întrea
şib
şi pentru care diferenţa dintre produsul şi suma lor este egală cub
( dacă nu există aceste numere se va afişa0 0
).
Restricții și precizări
1 ≤ a < b ≤ 1.000.000.000
1 ≤ c < b
b
are cel puţin3
cifre- pentru
cod=1
se pot obţine16p
, iar pentrucod
egal cu2
,3
sau4
câte28p
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 mari3
cifre ale luib
, scrise în ordine crescătoare, sunt0 1 1
. - pentru
cod=2
, numerele cuprinse între3
şi110
care sunt divizibile cu10
sunt10,20,30,...,100
, iar suma lor este550
. - pentru
cod=3
, numerele cuprinse între3
şi110
care au exact trei cifre egale cu1
în scrierea binară sunt7, 11, 13, 14, 19,...,88, 104
în total fiind34
de numere. - pntru
cod=4
, avema < 4 < 38 < b
şi4•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 .
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!