Pagini recente » Cod sursa (job #717676) | Cod sursa (job #2518678) | Cod sursa (job #1842077) | Cod sursa (job #2910479) | Cod sursa (job #1018413)
#include <iostream>
#include <fstream>
#include <math.h>
#include <vector>
#include <stdlib.h>
std::ifstream fin("ssnd.in");
std::ofstream fout("ssnd.out");
struct myVal
{
int aparitii, val;
};
std::vector<int> nrPrime;
void setPrime(bool prims[])
{
int n = 1000001;
prims[0] = true;
prims[1] = false;
for(int i = 2; i * i < n; i++)
{
if(prims[i] != true)
{
nrPrime.push_back(i);
prims[i] = false;
int j = i + i;
while(j * j < n)
{
prims[j] = true;
j += i;
}
}
}
}
void citire(int &n, int nr[])
{
fin>>n;
for(int i = 0; i < n; i++)
{
fin>>nr[i];
}
}
void rezolvare(int n, int nr[], bool prims[])
{
for(int i = 0; i < n; i++)
{
std::vector<myVal> divizorii;
int val = nr[i];
for(int j = 0; j * j <= val ; j++)
{
if(nr[i] % nrPrime[j] == 0)
{
myVal vs;
vs.val = nrPrime[j];
vs.aparitii = 0;
while(!(nr[i] % nrPrime[j]))
{
vs.aparitii++;
nr[i] = nr[i] / nrPrime[j];
}
divizorii.push_back(vs);
}
}
if(divizorii.empty())
{
myVal vs;
vs.aparitii = 1;
vs.val = val;
divizorii.push_back(vs);
}
int nrDiv = 1;
for(int i = 0; i < divizorii.size(); i++)
{
nrDiv = nrDiv * (divizorii[i].aparitii + 1);
}
fout<<nrDiv<<' ';
int sumaDiv = 1;
for(int i = 0; i < divizorii.size(); i++)
{
sumaDiv = sumaDiv * ((pow(divizorii[i].val, divizorii[i].aparitii + 1) - 1) / (divizorii[i].val - 1));
}
fout<<sumaDiv<<'\n';
}
}
int main()
{
int n;
bool prims[1000001];
int nr[1001];
setPrime(prims);
citire(n, nr);
rezolvare(n, nr, prims);
return 0;
}