Cerința
Această problemă nu are o descriere plicticoasă, menită să vă încurce.Trebuie doar să aflați cel mai mare număr natural n
, astfel încât b
0
+b
1
+...+b
n
≤y
, unde b
și y
sunt valori cunoscute.
Date de intrare
Fișierul de intrare inequation.in
va conține pe prima linie numărul t
, reprezentând numărul de teste ale problemei.Apoi urmează 3*t
rânduri, pentru fiecare test fiind precizată baza b
, numărul de cifre ale lui y
, precum și cifrele numărului y
, aflate fiecare pe un rând separat.
Date de ieșire
Fișierul de ieșire inequation.out
va conține pe linia i
numărul maxim de termeni pentru care se respectă condiția pentru testul cu numărul de ordine t
.
Restricții și precizări
1 ≤ b ≤ 100
- numărul de cifre ale lui
y <= 25.000
Exemplu
inequation.in
1 2 2 16
inequation.out
4
Explicație
2
0
+2
1
+2
2
+2
3
=15≤16
, deci în total patru termeni.
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 Inequation:
#include <iostream>
#include <fstream>
#define MAX 50000
using namespace std;
ifstream fin("inequation.in");
ofstream fout("inequation.out");
typedef int Huge;
void Adunare(Huge a[], Huge b[])
{
if(b[0]>a[0])
a[0]=b[0];
int T=0;
for(int i=1; i<=a[0]; i++)
{
a[i]+=b[i]+T;
T=a[i]/10;
a[i]%=10;
}
if(T)
a[++a[0]]=T;
}
void Inmultire(Huge a[], int b)
{
int T=0;
for(int i=1; i<=a[0]; i++)
{
a[i]=a[i]*b+T;
T=a[i]/10;
a[i]%=10;
}
while(T)
a[++a[0]]=T%10, T/=10;
}
bool comp(Huge a[], Huge b[])
{
if(a[0]<b[0])
return true;
if(a[0]>b[0])
return false;
int IND=a[0];
while(a[IND]==b[IND]&&IND>1)
IND--;
if(a[IND]>b[IND])
return false;
return true;
}
int query(int baza, Huge Y[])
{
int nn=0;
bool found=false;
Huge R[MAX] {0};
R[0]=R[1]=1;
for(int j=1; j<=MAX&&!found; j++)
{
Inmultire(R,baza);
if(comp(R,Y))
nn++;
else
found=true;
}
return nn;
}
int main()
{
int t;
fin >> t;
for(int i=1; i<=t; i++)
{
int b;
fin >> b;
Huge V[MAX] {0};
char c[MAX];
fin >> V[0] >> c;
for(int i=0; i<V[0]; i++)
V[i+1]=c[V[0]-i-1]-'0';
int A[MAX] {0}, bb=b-1;
A[0]=1, A[1]=1;
Inmultire(V,bb);
Adunare(V,A);
fout << query(b,V) << "\n";
}
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 #2463 Inequation
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2463 Inequation 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!