Se dă un şir de n numere naturale nenule x1, x2, …, xn şi un număr natural m.
Cerința
Să se verifice dacă valoarea expresiei x1⋅x2⋅…⋅xn−−−−−−−−−−−−√m este un număr natural. În caz afirmativ să se afișeze acest număr descompus în factori primi.
Date de intrare
Fișierul de intrare exp.in conține pe prima linie m, pe linia a doua n, iar pe linia a treia numerele x1, x2, …, xn separate între ele prin câte un spațiu.
Date de ieșire
În fișierul de ieșire exp.out se va scrie pe prima linie cifra 0, dacă valoarea expresiei nu este un număr natural, respectiv 1 dacă este un număr natural. Dacă valoarea expresiei este un număr natural pe următoarele linii se vor scrie perechi de forma p e (p este factor prim care apare în descompunere la puterea e>=1). Aceste perechi se vor scrie în ordine crescătoare după primul număr (adică p).
Restricții și precizări
0 < n < 50000 < xi < 30.001, pentru oricei=1..nmpoate fi una din cifrele2,3,4.
Exemplul 1:
exp.in
2 4 32 81 100 19
exp.out
0
Exemplul 2:
exp.in
2 4 32 81 100 18
exp.out
1 2 4 3 3 5 1
#include <bits/stdc++.h>
using namespace std;
ifstream cin("exp.in");
ofstream cout("exp.out");
int f[5001];
int main()
{
int n , x , rad , ok = 0;
cin >> rad;
cin >> n;
for(int i = 1 ; i <= n ; i++)
{
cin >> x;
int d = 2;
while(x > 1)
{
int p = 0;
while(x % d == 0) p++ , x /= d;
if(p) f[d] += p;
d++;
if(d * d > x) d = x;
}
}
for(int i = 1 ; i <= 5000 ; i++)
if(f[i] != 0)
if(f[i] % rad != 0) ok = 1;
if(ok == 1)cout << 0;
else
{
cout << 1 << '\n';
for(int i = 1 ; i <= 100 ; i++)
if(f[i] != 0)
cout << i << " " << f[i] / rad << '\n';
}
}