Rezolvare completă PbInfo #1054 Galbeni

După ce au descoperit ascunzătoarea piratului Spânu, marinarii de pe corabia “Speranţa” au hotărât să ofere sătenilor o parte din comoara acestuia. Întrucât comoara avea un număr nelimitat de bani din aur, numiţi galbeni, singura problemă a marinarilor a fost regula după care să împartă banii.

După îndelungi discuţii au procedat astfel: i-au rugat pe săteni să se aşeze în ordine la coadă şi să vină, pe rând, unul câte unul pentru a-şi ridica galbenii cuveniţi. Primul sătean a fost rugat să îşi aleagă numărul de galbeni, cu condiţia ca acest număr să fie format din exact K cifre. Al doilea sătean va primi un număr de galbeni calculat astfel: se înmulţeşte numărul de galbeni ai primului sătean cu toate cifrele nenule ale acelui număr, rezultatul se înmulţeşte cu 8 şi apoi se împarte la 9 păstrându-se doar ultimele K cifre ale câtului împărţirii. Dacă numărul obţinut are mai puţin de K cifre, atunci acestuia i se adaugă la final cifra 9, până când se completează K cifre.

Pentru a stabili câţi galbeni primeşte al treilea sătean, se aplică aceeaşi regulă, dar pornind de la numărul de galbeni ai celui de-al doilea sătean. Regula se aplică în continuare fiecărui sătean, plecând de la numărul de galbeni primiţi de săteanul care a stat la coadă exact în faţa lui.

Cerința

Cunoscând numărul de galbeni aleşi de primul sătean, determinaţi numărul de galbeni pe care îl va primi al N-lea sătean.

Date de intrare

Fișierul de intrare galbeni.in conține pe prima linie cele 3 numere naturale nenule S, K, N separate prin câte un spaţiu, unde S reprezintă numărul de galbeni ales de primul sătean, K este numărul de cifre ale numărului S, iar N reprezintă numărul de ordine al săteanului pentru care se cere să determinaţi numărul de galbeni primiţi.

Date de ieșire

Fișierul de ieșire galbeni.out va conține pe unica sa linie un număr natural reprezentând rezultatul determinat.

Restricții și precizări

  • 2 ≤ N ≤ 1 000 000 000
  • 1 ≤ K ≤ 3
  • Se garantează că S are exact K cifre.

Exemplul 1

galbeni.in

51 2 3

galbeni.out

77

Explicație

Primul sătean a luat 51 de galbeni. Cel de al doilea sătean va primi 26 de galbeni
(51 se înmulţeşte cu cifrele nenule 51*5*1=255, 255 se înmulţeşte cu 8 =2040. Câtul împărţirii lui 2040 la 9 este 226, ultimele două cifre fiind 26).

Cel de al treilea sătean va primi 77 de galbeni (26 se înmulţeşte cu cifrele nenule 26*2*6=312, 312 se înmulţeşte cu 8 şi obţinem numărul 2496. Câtul împărţirii dintre 2469 şi 9 este 277, ultimele două cifre fiind 77)

Exemplul 2

galbeni.in

10 2 3

galbeni.out

96

Explicație

Primul sătean primeşte 10 galbeni. Pentru a calcula câţi galbeni primeşte al doilea sătean procedăm astfel: înmulţim 10 cu cifele sale nenule: 10*1 = 10, apoi cu 8,
10*8 = 80. Câtul împărţirii lui 80 la 9 este 8. Acest număr având mai puţin de K=2 cifre, se adaugă la finalul său cifra 9 şi se obţine 89.

Pentru al treilea sătean se pleacă de la 89 (89*8*9=6408, 6408*8=51264, câtul împărţirii lui 51264 la 9 este 5696, ultimele două cifre sunt 96)

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

#include <fstream>

using namespace std;

int x, k, n, z, p, y, i, m;
int v[10010], w[10010];

int main() {
    ifstream fin("galbeni.in");
    ofstream fout("galbeni.out");
    fin>>x>>k>>n;
    v[x] = 1;
    z = 1;
    for (i=1;i<=k;i++)
        z = z * 10;
    w[1] = x;
    for (i=2;i<=n;i++) {
        y = x;
        p = x;
        while (y!=0) {

            if (y%10 != 0) {
                p = p * (y%10);
            }
            y = y/10;
        }
        p = p * 8;
        p = p/9;
        p = p%z;
        while (p*10 < z)
            p = p * 10 + 9;
        if (v[p]!=0) {
            m = n-(v[p]-1);
            m = m % (i-v[p]);
            if (m == 0) {
                fout<<w[i-1]<<"
";
            } else {
                fout<<w[v[p] + m - 1]<<"
";
            }
            return 0;
        }
        x = p;
        v[x] = i;
        w[i] = x;
    }
    fout<<w[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 Adresa de email.

Rezolvarea problemei #1054 Galbeni

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