Rezolvare completă PbInfo #141 compuneri

După descoperirea vieţii pe planeta Marte, cercetătorii pământeni au început activitatea de studiere a fiinţelor vii marţiene. Prima constatare a fost că este o legătură strânsă între modul de formare a acestora şi numerele naturale. Astfel, unei specii i s-a asociat un număr natural mai mare decât 1. Mai mult, oricare două specii se pot compune, rezultând altă specie. Numărul asociat noii specii este dat de produsul numerelor asociate celor două specii care se compun. Astfel, modalitatea de obţinere a unei specii nu este unică (o specie ce are asociat numărul 12 se poate obţine compunând specia 2 cu specia 6, sau specia 3 cu specia 4). Evident, unele specii se pot obţine prin compunerea altora (ex. 12) dar unele nu se pot obţine prin compunere. Pe acestea din urmă le vom numi atomi (de exemplu specia ce are asociat codul 7 este atom, şi mai sunt şi altele). O specie se poate compune cu ea însăşi rezultând altă specie (de exemplu, prin compunerea speciei 3 cu ea însăşi se obţine specia 9). De asemenea, dacă specia X se poate obţine prin compunerea speciilor Y şi Z spunem că X are în compoziţie pe Y şi pe Z. Mai mulţi cercetători au recoltat probe obţinând astfel o listă de coduri ale speciilor pe care le-au observat.

Cerinţă

Scrieţi un program care, pe baza codurilor din lista formată, să determine:
a) numărul de atomi din listă;
b) numărul de specii din listă care nu pot avea în compoziţie niciun atom dintre cei aflaţi în listă;

Date de intrare

Fişierul compuneri.in conţine pe prima linie un număr natural N. Pe linia a doua se află N numere naturale separate prin câte un spaţiu. Acestea reprezintă codurile speciilor din listă.

Date de ieşire

Fişierul compuneri.out va conţine pe prima linie două valori naturale separate printr-un spaţiu, ce reprezintă numerele din cerinţă: (primul număr va fi valoarea calculată pentru cerinţa a) ).

Restricţii şi precizări

  • 1 <= N <= 100000;
  • 2 <= numerele din listă ≤ 100000;
  • Numerele din listă se pot repeta iar la rezultat se va contoriza fiecare apariţie;

Exemplu

compuneri.in

10
7 7 121 11 3 29 32 3 1300 17

compuneri.out

7 2

Explicație

În listă sunt 7 atomi: 7, 7, 11, 3, 29, 3, 17

Dintre celelalte trei valori, 121 se formează prin compunerea atomului existent 11 cu el însuşi iar celelalte două nu se pot obţine prin compuneri ale atomilor existenţi.

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

//100p
#include <stdio.h>
#include <string.h>
#define DIM 100010

int C[DIM];
int P[DIM];
int Q[DIM];
int V[DIM];
int N, Vmax, i, j, p, q, D;


int main() {
    FILE *f = fopen("compuneri.in","r");
    fscanf(f,"%d",&N);
    for (i=1;i<=N;i++) {
        fscanf(f,"%d",&V[i]);
        if (V[i]>Vmax)
            Vmax = V[i];
    }
    fclose(f);

    for (i=2;i<=Vmax;i++)
        if (C[i] == 0) {
            for (j=i+i;j<=Vmax;j+=i)
                C[j] = 1;

        }

    for (i=1;i<=N;i++)
        if (!C[V[i]])
            P[++p] = V[i];
        else
            Q[++q] = V[i];

    memset(C, 0, sizeof(C));
    for (i=1;i<=p;i++) {
        C[P[i]] = 1;
        for (j=P[i]+P[i];j<=Vmax; j+=P[i])
            C[j] = 1;
    }
    for (i=1;i<=q;i++)
        if (C[Q[i]] == 0)
            D++;
    FILE *g = fopen("compuneri.out","w");
    fprintf(g,"%d %d",p,D);
    fclose(g);
    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 #141 compuneri

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