Pagini recente » Cod sursa (job #498375) | Cod sursa (job #2235720) | Cod sursa (job #2111745) | Cod sursa (job #463776) | Cod sursa (job #2024541)
#include <stdio.h>
#include <vector>
FILE *f1 = fopen("sum.in","r");
FILE *f2 = fopen("sum.out","w");
const int X = 100001;
std::vector<int> div[X]; ///div[i] = divizorii primi ai lui i
int i, j, n, y;
long long sol, x, s;
void generateDiv()
{
for(i=2; i<=X/2; i++)
if(div[i].size() == 0) ///daca este prim
{
for(j=i; j<X; j+=i)
div[j].push_back(i);
}
}
///calculeaza suma primilor n term. unei p.a. cu a1 = r
inline int sum(int r, int n)
{
return ((2*r + (n-1) * r) * n)/2;
}
int main()
{
generateDiv();
fscanf(f1,"%d",&n);
while(n--)
{
fscanf(f1,"%lld",&x);
sol = x * (2*x + 1); ///suma primelor 2x numere naturale
for(i=0;i<div[x].size();i++)
{
sol -= sum(div[x][i], x*2/div[x][i]);
}
for(i=0;i<div[x].size()-1;i++)
{
for(j=i+1;j<div[x].size();j++)
{
y = div[x][i] * div[x][j];
sol += sum(y, x*2/y);
}
}
fprintf(f2,"%lld\nf",sol);
}
return 0;
}