Rezolvare completă PbInfo #2472 fractal

Andra este o fetiță pasionată de desen. Pentru a-și îmbunătăți performanțele școlare la geometrie, Andra îmbină pasiunea pentru desen cu rezolvarea problemelor de geometrie. Astfel, pe o foaie de matematică împărțită în pătrățele dispuse pe \(2^N \) linii şi \(2^N \) coloane, Andra desenează în centru o figură de forma unui pătrat de latură \(2^{N-1} \) (figura 1) . Pentru fiecare colț al figurii, Andra desenează alte 4 noi figuri cu latura egală cu jumătate din latura figurii inițiale (Figura 2). Repetă procedeul de desenare pentru fiecare nouă figură obținută, până când ajunge la marginea foii de hârtie, fără a depăși marginile acesteia. Fiecare pătrățel care face parte dintr-o figură desenată este colorat, pentru a se distinge pe foaia de hârtie. Fiecare figură desenată este un pătrat cu laturile paralele cu marginile foii de hârtie.

Cerința

Scrieţi un program care citește numărul N , corespunzător dimensiunii de \(2^N\) x \(2^N \) a foii de desen şi determină:

1) Numărul de figuri de latură minimă desenate;
2) Numărul total de pătrățele colorate cel puțin o dată de pe foaia de hârtie.

Date de intrare

Fişierul de intrare fractal.in conţine pe prima linie numărul natural C reprezentând cerința din problemă care
trebuie rezolvată (1 sau 2) și pe a doua linie, un număr natural N cu semnificația de mai sus.

Date de ieșire

Dacă valoarea lui C este 1, fişierul de ieşire fractal.out va conţine un număr natural care reprezintă numărul
de figuri de latură minimă. Dacă valoarea lui C este 2, fişierul de ieşire fractal.out va conţine un număr
natural care reprezintă numărul total de pătrățele colorate cel puțin o dată de pe foaia de hârtie.

Restricții și precizări

  • 1 < N ≤ 10000
  • Pentru 30% dintre teste N≤30
  • Pentru rezolvarea corectă a cerinţei 1 se obțin 30 de puncte, iar pentru rezolvarea corectă a cerinţei 2 se obțin
    70 de puncte.

Exemplu 1:

fractal.in

1
4

fractal.out

16

Explicație

Suprafața de desen are 16 linii și 16 coloane (figura 3). Pornind de la figura inițială se vor desena mai întâi 4 figuri, apoi 16 figuri.

Exemplu 2:

fractal.in

1
5

fractal.out

64

Explicație

Suprafața de desen are 32 linii și 32 coloane (figura 4). Pornind de la figura inițială se vor desena mai întâi 4 figuri, apoi 16 figuri, respectiv 64 figuri de latură minimă.

Exemplu 3:

fractal.in

2
4

fractal.out

148

Explicație

Suprafața desenată este cea din figura 3. Numărul de pătrățele colorate cel puțin o dată este de 148 din totalul de 256 de pătrățele.

fractal.in

2
5

fractal.out

700

Explicație

Suprafața desenată este cea din figura 4. Numărul de pătrățele colorate cel puțin o dată este de 700 din totalul de 1024 de pătrățele.

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

#include <fstream>
using namespace std;
ifstream fin("fractal.in");
ofstream fout("fractal.out");
unsigned N,C,i,j,ct,a[100001],b[100001],p;

int main()
{
    fin>>C>>N;
    ///cerinta 1
    if(C==1)
    {
        ///calculam 4 la puterea N-2
        a[0]=a[1]=1;

        for(i=1;i<=N-2;i++)
        {
            for(j=1,ct=0;j<=a[0];j++)
            { a[j]=a[j]*4+ct;ct=a[j]/10; a[j]=a[j]%10;}
            while(ct){a[0]++;a[a[0]]=ct%10;ct/=10;}
        }
        for(j=a[0];j>=1;j--)
            fout<<a[j];
        fout<<'\n';
        return 0;
    }
    ///cerinta 2
    ///calculam 4 la N in vect a
    a[0]=1;a[1]=1;

    for(i=1;i<=N;i++)
    {
        for(j=1,ct=0;j<=a[0];j++)
        { a[j]=a[j]*4+ct;ct=a[j]/10; a[j]=a[j]%10;}
        while(ct){a[0]++;a[a[0]]=ct%10;ct/=10;}
    }
    ///calculam 4*(3^(N-1)) in vect b
    b[0]=1;b[1]=4;
    for(i=1;i<=N-1;i++)
    {
        for(j=1,ct=0;j<=b[0];j++)
        { b[j]=b[j]*3+ct;ct=b[j]/10; b[j]=b[j]%10;}
        while(ct){b[0]++;b[b[0]]=ct%10;ct/=10;}
    }
    ///in final calculez (4^N)-4*(3^(N-1))
    for(i=1,ct=0;i<=a[0];i++)
    {
        if(a[i]>=b[i]+ct){a[i]=a[i]-ct-b[i];ct=0;}
        else
        {a[i]=a[i]+10-ct-b[i];ct=1;}
    }
    while(a[a[0]]==0)a[0]--;///nu e cazul, dar...
    ///afisam rezultatul final
    for(j=a[0];j>=1;j--)
        fout<<a[j];
    fout<<'\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 #2472 fractal

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