Informatică, întrebare adresată de ionutg38, 9 ani în urmă

Se dă un şir cu n numere naturale nenule care sunt divizibile doar cu numerele prime 2, 3 sau 5. Determinaţi numărul secvenţelor din şir pentru care produsul elementelor este pătrat perfect.

Date de intrare
Fișierul de intrare produs3.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule divizibile doar cu numerele prime 2, 3 sau 5, separate prin spații.

Date de ieșire
Fișierul de ieșire produs3.out va conține pe prima linie numărul S, reprezentând numărul secvenţelor din şir pentru care produsul elementelor este pătrat perfect.

Restricții și precizări
1 ≤ n ≤ 1.000.000
numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000



Exemplu
produs3.in

5
12 3 4 5 45
produs3.out

6
Explicație
În şirul dat sunt 6 sevenţe pentru care produsul elementelor este pătrat perfect:

12 , 3
12 , 3 , 4
4
5 , 45
4 , 5 , 45
12 , 3 , 4 , 5 , 45

Răspunsuri la întrebare

Răspuns de blindseeker90
1
Programul afiseaza toate secventele posibile in outputul ferestrei
#include <iostream>
#include <fstream>
using namespace std;
int divizori[300];

int main(){
int n,i,k=0,j,temp,v[100],nr=0,div2,div3,div5;
ifstream fin("produs3.in");
ofstream fou("produs3.out");
fin>>n;
for(i=0;i<n;i++){
fin>>v[i];
temp=v[i];
while(temp%2==0){
divizori[3*i]++;
temp=temp/2;

}
temp=v[i];
while(temp%3==0){
divizori[3*i+1]++;
temp=temp/3;
}
temp=v[i];
while(temp%5==0){
divizori[3*i+2]++;
temp=temp/5;
}
}
while(k<n){
div2=0;
div3=0;
div5=0;
for(i=k;i<n;i++){
div2=div2+divizori[3*i];
div3=div3+divizori[3*i+1];
div5=div5+divizori[3*i+2];
if(div2%2==0&&div3%2==0&&div5%2==0){
nr++;
for(j=k;j<=i;j++){
cout<<v[j]<<" ";
}
cout<<endl;
}
}
k++;
}
fou<<nr;
return 0;
}

ionutg38: Problema are si indicatii de rezolvare:
ionutg38: Se calculează exponenţii lui 2, 3 şi 5 din descompunerea în factori primi a fiecărui număr din şir, precum şi exponenţii cumulaţi crescător.

În funcţie de paritatea exponenţilor cumulaţi se atribuie un cod de la 0 la 7 fiecărei poziţii din şir. Două poziţii cu acelaşi cod determină o secvenţă cu proprietatea cerută, deci se vor număra pentru fiecare cod câte perechi de poziţii cu acelaşi cod există.
ionutg38: Cu rezolvarea de mai sus, pe unele teste depaseste timpul (1.5 secunde).
ionutg38: Multumesc, oricum
blindseeker90: Nu inteleg aceasta parte: 'doua pozitii cu acelasi cod determina o secventa cu proprietatea ceruta' ce inseamna 2 pozitii cu acelasi cod? Sunt cazuri in care si un singur numar poate fi o secventa, nu iti trebuie minimum 2 numere/coduri
ionutg38: Indicatiile nu-mi apartin. Si eu m-am gandit la acelasi lucru.
blindseeker90: Codul binar de paritate al exponentilor functioneaza in felul urmator: daca ai 4, atunci in factori primi ai 2^2*3^0*5^0 adica in functie de cum se imparte la 2: 000(toti exponentii se impart la 2) daca ai 12=2^2*3^1*5^0 o sa ai codul 010(exponentul lui 3 nu se imparte la 2)
blindseeker90: O rezolvare mai rapida decat a mea ar fi sa gasesti toate codurile care adunate fac 000 pentru ca inseamna atunci ca toti exponentii vor fi divizibili cu 2: precum 12*3=36 este 010*010=000 si observi ca daca doua coduri sunt identice atunci produsul lor este 0 pe linie, caci devine apoi divizibil cu 2 peste tot. Cred ca la asta se refera solutia
blindseeker90: M-am gandit si la varianta aceasta, dar nu am facut asa pentru ca mi-a fost teama ca nu o sa mai intelegi codul
blindseeker90: scuze 010+010=000, le aduni pentru ca exponentii se aduna atunci cand inmultesti numere
Alte întrebări interesante