fbpx

Problema #1364 – produs3 – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

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 secvenţ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

#include <bits/stdc++.h>
using namespace std;

ifstream cin("produs3.in");
ofstream cout("produs3.out");

int exp(int n , int x)
{
    int c = 0;
    while(n % x == 0)
    {
        n /= x;
        c++;
    }
    return c;

}

int main()
{
    int n , c2 = 0 , c3 = 0 , c5 = 0 , f[1001] = {0} , x;
    unsigned long long c = 0;
    cin >> n;
    for(int i = 1 ; i <= n ; i++)
    {
        cin >> x;
        c2 = (c2 + exp(x , 2)) % 2;
        c3 = (c3 + exp(x , 3)) % 2;
        c5 = (c5 + exp(x , 5)) % 2;
        f[4*c2 + 2*c3 + c5]++;
        //cout << 4*c2 + 2*c3 + c5 << endl;
    }
    c = f[0];
    for(int i = 0 ; i <= 10 ; i++)
        c = c + 1ll * f[i] * (f[i] - 1) / 2;
    cout << c;
}
Comentarii

S-ar putea sa iti placa