Pagini recente » Cod sursa (job #244563) | Probleme de Taietura | Cod sursa (job #2963852) | Cod sursa (job #1628964) | Cod sursa (job #2723714)
#include <fstream>
#define UI unsigned int
#define ULL unsigned long long
#define MAX (UI)100000
std::ifstream fin("sum.in");
std::ofstream fout("sum.out");
UI vf[256810], urm[256810], last[100001];
UI dv[10], t;
void adaugaVf(UI from, UI to)
{
static UI nr = 0;
vf[++nr] = to;
urm[nr] = last[from];
last[from] = nr;
}
ULL sumaG(ULL a)
{
return a * (a + 1) / 2;
}
int main()
{
for(UI i = 2; i <= MAX; i++)
if(!last[i])
for(UI j = i * 2; j <= MAX; j += i)
adaugaVf(j, i);
UI n, nr;
ULL suma;
fin >> n;
while(n--)
{
fin >> nr;
t = 0;
for(UI k = last[nr]; k; k = urm[k])
dv[t++] = vf[k];
if(t == 0)
fout << sumaG(nr * 2 - 1) - nr << '\n';
else
{
suma = 0;
nr *= 2;
for(UI i = 0, iMax = (1 << t), nrMult = 0, dvMult = 1; i < iMax; i++, nrMult = 0, dvMult = 1)
{
for(UI j = 0; j < t; j++)
if(i & (1<<j))
{
nrMult++;
dvMult *= dv[j];
}
if(nrMult % 2)
suma -= sumaG(nr / dvMult) * dvMult;
else
suma += sumaG(nr / dvMult) * dvMult;
}
fout << suma << '\n';
}
}
return 0;
}