Cod sursa(job #2216948)
Utilizator | Onut Andrei andreiomd1 | Data | 28 iunie 2018 14:22:04 |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.43 kb |
#include <bits/stdc++.h>
using namespace std;
ifstream f("ssnd.in");
ofstream g("ssnd.out");
const int MOD=9973;
const int val_max=1e6;
bool ciur[val_max+5];
int prime[val_max+5], cnt, d;
int i, j;
int t, aux;
long long x;
long long produs, nd, sum, p;
int main()
{
//Ciurul lui Eratostene
ciur[0]=ciur[1]=true;
for(i=3; i*i<=1000001; i+=2)
if(ciur[i]==false)
for(j=2; j*i<=1000001; j++)
ciur[i*j]=true;
cnt++;
prime[cnt]=2;
for(i=3; i<=1000001; i+=2)
if(ciur[i]==false)
prime[++cnt]=i;
//
/*for(i=1; i<=cnt; i++)
g<<prime[i]<<' ';*/
f>>t;
for(i=1; i<=t; i++)
{
f>>x;
d=2;
sum=1;
nd=1;
aux=1;
while(d*d<=x && aux<=cnt)
{
if(x%d==0)
{
p=0;
produs=1;
while(x%d==0)
{
p++;
x/=d;
produs*=d;
}
if(p)
{
nd*=(p+1);
sum*=((produs*d-1)/(d-1));
}
}
aux++;
d=prime[aux];
}
if(x!=1)
{
nd*=2;
sum*=((x*x-1)/(x-1));
}
g<<nd<<' '<<sum<<'\n';
}
return 0;
}