#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <bits/stdc++.h>
#include <time.h>
using namespace std;
#define sizeN 8000000
int arrPrime[sizeN] = {0};
vector<int> PrimesTSqrtN(arrPrime, arrPrime + sizeof(arrPrime) / sizeof(arrPrime[0]));
int countv;
void MarkMultiples(bool mark[],int a,int n)
{
int i=2,k;
while((k=i*a)<=n)
{
mark[k]=1; //mark NOT number primes up to srtn(n)
i++;
}
}
void SieveOfEratosthenes(int n)
{
//bool mark[sizeN];
bool * mark = new bool[sizeN];
countv=0;
if(n>=2)
{
mark[n+1]={0};
int pierwiastek = sqrt(n);
for(int i=2;i<=pierwiastek;++i)
{
if(mark[i]==0)
MarkMultiples(mark,i,n);
}
for(int i=2;i<=n;++i) {
if(mark[i]==0) {
PrimesTSqrtN[countv++]=i;
}
}
}
PrimesTSqrtN.resize(countv);
}
void faktoryzacja(int liczba, int rozmiar) {
int i, iloraz = 1;
int liczbaStart = liczba;
bool wyjdz = false;
string gwiazdka = "*";
for (i=0; i<rozmiar; i++) {
if (iloraz == liczbaStart) {
break;
}
if (liczba%PrimesTSqrtN[i]==0) {
liczba /= PrimesTSqrtN[i];
iloraz *= PrimesTSqrtN[i];
if (iloraz == liczbaStart) {
gwiazdka = "\n";
wyjdz = true;
}
cout << PrimesTSqrtN[i] << gwiazdka;
if (wyjdz) break;
--i;
}
}
}
int main()
{
int ilosc, rozmiar;
cin >> ilosc;
vector<int> tmpArr(ilosc);
clock_t tStart = clock();
SieveOfEratosthenes(8000000); //~0,22s
rozmiar = PrimesTSqrtN.size();
for (int k = 0; k < ilosc; k++) {
cin >> tmpArr[k];
//sprawdzamy czy podana liczba jest liczba pierwsza - tablica jest posortowana wyszukiwanie binarne
if (std::binary_search(PrimesTSqrtN.begin(), PrimesTSqrtN.end(), tmpArr[k]) || tmpArr[k] == 1) {
cout << tmpArr[k] << endl;
}
else {
faktoryzacja(tmpArr[k], rozmiar);
}
}
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);
/*clock_t tStart = clock();
for (int k = 0; k < 1000000; k++) { //~loop rotation 0,04s
//if (std::find(PrimesTSqrtN.begin(), PrimesTSqrtN.end(),tmpArr[k])!=PrimesTSqrtN.end() || tmpArr[k] == 1) {
if (std::binary_search(PrimesTSqrtN.begin(), PrimesTSqrtN.end(), k) || k == 1) { //~1,32s, 0,35s on laptop
//cout << k << endl;
}
else {
faktoryzacja(k, rozmiar); //~129,26-136,97 for 1000000 faktoryzacja 0.000137 for one
}
}
printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);*/
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGUgPHRpbWUuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIHNpemVOIDgwMDAwMDAKCmludCBhcnJQcmltZVtzaXplTl0gPSB7MH07CnZlY3RvcjxpbnQ+IFByaW1lc1RTcXJ0TihhcnJQcmltZSwgYXJyUHJpbWUgKyBzaXplb2YoYXJyUHJpbWUpIC8gc2l6ZW9mKGFyclByaW1lWzBdKSk7CmludCBjb3VudHY7CnZvaWQgTWFya011bHRpcGxlcyhib29sIG1hcmtbXSxpbnQgYSxpbnQgbikKewogICAgICAgaW50IGk9MixrOwogICAgICAgd2hpbGUoKGs9aSphKTw9bikKICAgICAgIHsKICAgICAgICAgICAgICBtYXJrW2tdPTE7ICAvL21hcmsgTk9UIG51bWJlciBwcmltZXMgdXAgdG8gc3J0bihuKQogICAgICAgICAgICAgIGkrKzsKICAgICAgIH0KfQoKCnZvaWQgU2lldmVPZkVyYXRvc3RoZW5lcyhpbnQgbikKewogICAgICAgLy9ib29sIG1hcmtbc2l6ZU5dOwogICAgICAgYm9vbCAqIG1hcmsgPSBuZXcgYm9vbFtzaXplTl07CiAgICAgICBjb3VudHY9MDsKICAgICAgIGlmKG4+PTIpCiAgICAgICB7CiAgICAgICAgICAgICAgbWFya1tuKzFdPXswfTsKICAgICAgICAgICAgICBpbnQgcGllcndpYXN0ZWsgPSBzcXJ0KG4pOwogICAgICAgICAgICAgIGZvcihpbnQgaT0yO2k8PXBpZXJ3aWFzdGVrOysraSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmKG1hcmtbaV09PTApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJrTXVsdGlwbGVzKG1hcmssaSxuKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZm9yKGludCBpPTI7aTw9bjsrK2kpIHsKICAgICAgICAgICAgICAgICAgICBpZihtYXJrW2ldPT0wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFByaW1lc1RTcXJ0Tltjb3VudHYrK109aTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgIH0KICAgICAgIFByaW1lc1RTcXJ0Ti5yZXNpemUoY291bnR2KTsKfQoKdm9pZCBmYWt0b3J5emFjamEoaW50IGxpY3piYSwgaW50IHJvem1pYXIpIHsKICAgIGludCBpLCBpbG9yYXogPSAxOwogICAgaW50IGxpY3piYVN0YXJ0ID0gbGljemJhOwogICAgYm9vbCB3eWpkeiA9IGZhbHNlOwogICAgc3RyaW5nIGd3aWF6ZGthID0gIioiOwoKICAgIGZvciAoaT0wOyBpPHJvem1pYXI7IGkrKykgewogICAgICAgIGlmIChpbG9yYXogPT0gbGljemJhU3RhcnQpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChsaWN6YmElUHJpbWVzVFNxcnROW2ldPT0wKSB7CiAgICAgICAgICAgIGxpY3piYSAvPSBQcmltZXNUU3FydE5baV07CiAgICAgICAgICAgIGlsb3JheiAqPSBQcmltZXNUU3FydE5baV07CgogICAgICAgICAgICBpZiAoaWxvcmF6ID09IGxpY3piYVN0YXJ0KSB7CiAgICAgICAgICAgICAgICBnd2lhemRrYSA9ICJcbiI7CiAgICAgICAgICAgICAgICB3eWpkeiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY291dCA8PCBQcmltZXNUU3FydE5baV0gPDwgZ3dpYXpka2E7CgogICAgICAgICAgICBpZiAod3lqZHopIGJyZWFrOwogICAgICAgICAgICAtLWk7CiAgICAgICAgfQogICAgfQp9CgoKaW50IG1haW4oKQp7CiAgICBpbnQgaWxvc2MsIHJvem1pYXI7CiAgICBjaW4gPj4gaWxvc2M7CiAgICB2ZWN0b3I8aW50PiB0bXBBcnIoaWxvc2MpOwogICAgY2xvY2tfdCB0U3RhcnQgPSBjbG9jaygpOwogICAgU2lldmVPZkVyYXRvc3RoZW5lcyg4MDAwMDAwKTsgLy9+MCwyMnMKICAgIHJvem1pYXIgPSBQcmltZXNUU3FydE4uc2l6ZSgpOyAgCgoKICAgIGZvciAoaW50IGsgPSAwOyBrIDwgaWxvc2M7IGsrKykgewogICAgICAgIGNpbiA+PiB0bXBBcnJba107CgogICAgICAgIC8vc3ByYXdkemFteSBjenkgcG9kYW5hIGxpY3piYSBqZXN0IGxpY3piYSBwaWVyd3N6YSAtIHRhYmxpY2EgamVzdCBwb3NvcnRvd2FuYSB3eXN6dWtpd2FuaWUgYmluYXJuZQogICAgICAgIGlmIChzdGQ6OmJpbmFyeV9zZWFyY2goUHJpbWVzVFNxcnROLmJlZ2luKCksIFByaW1lc1RTcXJ0Ti5lbmQoKSwgdG1wQXJyW2tdKSB8fCB0bXBBcnJba10gPT0gMSkgewogICAgICAgICAgICBjb3V0IDw8IHRtcEFycltrXSA8PCBlbmRsOwogICAgICAgIH0KCiAgICAgICAgZWxzZSAgewogICAgICAgICAgICBmYWt0b3J5emFjamEodG1wQXJyW2tdLCByb3ptaWFyKTsKICAgICAgICB9CiAgICB9CiAgICBwcmludGYoIlRpbWUgdGFrZW46ICUuMmZzXG4iLCAoZG91YmxlKShjbG9jaygpIC0gdFN0YXJ0KS9DTE9DS1NfUEVSX1NFQyk7CgogICAgLypjbG9ja190IHRTdGFydCA9IGNsb2NrKCk7CiAgICBmb3IgKGludCBrID0gMDsgayA8IDEwMDAwMDA7IGsrKykgeyAgLy9+bG9vcCByb3RhdGlvbiAwLDA0cwogICAgICAgIC8vaWYgKHN0ZDo6ZmluZChQcmltZXNUU3FydE4uYmVnaW4oKSwgUHJpbWVzVFNxcnROLmVuZCgpLHRtcEFycltrXSkhPVByaW1lc1RTcXJ0Ti5lbmQoKSB8fCB0bXBBcnJba10gPT0gMSkgewogICAgICAgIGlmIChzdGQ6OmJpbmFyeV9zZWFyY2goUHJpbWVzVFNxcnROLmJlZ2luKCksIFByaW1lc1RTcXJ0Ti5lbmQoKSwgaykgfHwgIGsgPT0gMSkgeyAgLy9+MSwzMnMsIDAsMzVzIG9uIGxhcHRvcAogICAgICAgICAgICAvL2NvdXQgPDwgayA8PCBlbmRsOwogICAgICAgIH0KICAgICAgICBlbHNlICB7CiAgICAgICAgICAgIGZha3Rvcnl6YWNqYShrLCByb3ptaWFyKTsgIC8vfjEyOSwyNi0xMzYsOTcgZm9yIDEwMDAwMDAgZmFrdG9yeXphY2phIDAuMDAwMTM3IGZvciBvbmUKICAgICAgICB9CiAgICB9CgogICAgcHJpbnRmKCJUaW1lIHRha2VuOiAlLjJmc1xuIiwgKGRvdWJsZSkoY2xvY2soKSAtIHRTdGFydCkvQ0xPQ0tTX1BFUl9TRUMpOyovCgoKICAgIHJldHVybiAwOwp9Cg==