Rezolvare completă PbInfo #1471 maxdiv

Adrian este pasionat de matematică. El utilizează denumirea maxdiv pentru numărul care are cei mai mulţi divizori, dintre numerele unui şir dat. Adrian ştie că o secvenţă este un subşir de numere care apar pe poziţii consecutive într-un şir. El denumeşte secvenţă maxdiv o secvenţă din şir, formată din cel puţin două numere, ce începe şi se încheie cu un număr maxdiv şi nu conţine alte numere maxdiv în interior.

Având la dispoziţie un şir de n numere naturale, doreşte să afişeze cea mai lungă secvenţă maxdiv şi numărul de secvenţe maxdiv din şir. Dacă şirul de numere dat conţine mai multe secvenţe maxdiv de aceeaşi lungime maximă, se va afişa prima secvenţă de acest tip din şir.

Cerința

Scrieţi un program care afişează, pentru un şir dat format din n numere naturale numărul de secvenţe maxdiv şi cea mai lungă secvenţă maxdiv.

Date de intrare

Fişierul de intrare maxdiv.in conţine pe prima linie numărul n separat printr-un spaţiu de un număr natural t, care reprezintă cerinţa: 1, dacă se cere numărul de secvenţe maxdiv, respectiv 2 dacă se cere cea mai lungă secvenţă maxdiv. Linia a doua din fişier conţine cele n numere naturale ale şirului dat.

Date de ieșire

Fişierul de ieșire maxdiv.out va conţine pe prima linie un număr natural ce reprezintă numărul de secvenţe maxdiv, pentru şirul de numere dat, dacă cerinţa este 1. Dacă cerinţa este 2, fişierul de ieşire va conţine un şir de numere naturale, separate între ele prin câte un spaţiu, ce reprezintă cea mai lungă secvenţă maxdiv din şirul dat.

Restricții și precizări

  • 2 ≤ n ≤ 1000
  • 2 ≤ x[i] ≤ 1000000, unde x[i] reprezintă un număr din şirul dat
  • Şirul de numere conţine cel puţin o secvenţă care începe şi se încheie cu un număr maxdiv
  • Pentru cerința 1 se acordă 40% din punctaj, iar pentru cerința 2 se acordă 60% din punctaj.

Exemplu 1:

maxdiv.in

7 1
22 60 64 125 315 24 150

maxdiv.out

2

Explicație

Cerinţa 1: Şirul de numere dat conţine 3 numere maxdiv: 60, 315 şi 150 (au fiecare 12 divizori) și 2 secvenţe maxdiv : 60 64 125 315 şi 315 24 150.

Exemplu 2:

maxdiv.in

7 2
22 60 64 125 315 24 150

maxdiv.out

60 64 125 315

Explicație

Cerinţa 2: Şirul de numere dat conţine 2 secvenţe maxdiv: 60 64 125 315 şi 315 24 150. Cea mai lungă secvenţă este 60 64 125 315.

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

#include <fstream>
using namespace std;

ifstream fin("maxdiv.in");
ofstream fout("maxdiv.out");
int n,t, v[1002], i,j,dmax, a[1002];
int k,kmax,p,u,ns;
int nrdiv(int x)
{
    int e, d, nrd;
    nrd =1;
    if (x==1) nrd=1;
    else
    {
        d=2;
        while (x>1)
        {
            e=0;
            while (x%d==0)
            {
                e++;
                x=x/d;
            }
            nrd=nrd*(e+1);
            if (d==2) d++;
            else d=d+2;
        }
    }
    return nrd;
};

int main()
{
    fin>>n>>t;
    for (i=1; i<=n; i++)
    {
        fin>>v[i];
        a[i]=nrdiv(v[i]);
    }

    dmax=0;
    for (i=1; i<=n; i++)
    {
        if (a[i]>dmax)
            dmax=a[i];
    }
    for (i=1; i<=n; i++)
        if(a[i]==dmax)
            ns++;
    a[n+1]=dmax-1;
    for(i=1; i<=n; i++)
        if(a[i]==dmax)
        {
            j=i+1;
            k=1;
            while(j<=n&&a[j]!=dmax)
            {
                j++;
                k++;
            }
            if(k>kmax && a[j] == dmax)
            {
                kmax=k;
                p=i;
                u=j;
            }
            i=j-1;
        }
    if(t==1)
      fout<<ns-1<<endl;
    else
    for(i=p; i<=u; i++)
        fout<<v[i]<<' ';
    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 #1471 maxdiv

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