Cod sursa(job #1245108)
Utilizator | Data | 18 octombrie 2014 17:17:46 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 10 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.52 kb |
#include<fstream>
#include<cstdio>
using namespace std;
long long n,p1,p2,i,a,fa,e,p,j,M,ca,su=1;
bool v[1000010];
int main()
{
freopen("ssnd.in","r",stdin);
ofstream g ("ssnd.out");
scanf("%lld",&n);
p=1;
p2=1;
M=1000000;
for(i=2; i<=M; i++)
v[i]=true;
for(i=2; i<=M; i++)
if(v[i])
{
j=i*2;
while(j<=M)
{
v[j]=false;
j+=i;
}
}
for(i=1; i<=n; i++)
{
scanf("%lld",&a);
if(v[a])g<<2<<" "<<a+1<<'\n';
else
{
su=1;
p=1;
fa=2;
ca=a;
while(a>1&&fa*fa<=ca)
{
p1=1;
p2=1;
e=0;
while(a%fa==0)
{
a/=fa;
e++;
}
if(e)
{
p=p*(e+1);
for(j=1; j<=e+1; j++)
p2=p2*fa;
p2--;
p1=p2/(fa-1);
su=su*p1;
}
fa++;
if(fa*fa>ca&&a>1){
p=p*2;
for(j=1; j<=2; j++)
p2=p2*a;
p2--;
p1=p2/(a-1);
su=su*p1;
}
}
g<<p<<" "<<su<<'\n';
}
}
return 0;
}