Cod sursa(job #1986892)
Utilizator | Data | 29 mai 2017 10:55:33 | |
---|---|---|---|
Problema | Suma si numarul divizorilor | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.48 kb |
#include <iostream>
#include <cmath>
#include <fstream>
using namespace std;
int FactPrim(int x)
{
int nr=1,d=3,p=0,r;
while(x%2==0)
{
x/=2;
p++;
}
nr*=p+1;
r=sqrt(x);
while(d<=r)
{
p=0;
while(x%d==0)
{
p++;
x/=d;
}
if(p)
{
nr*=p+1;
r=sqrt(x);
}
d+=2;
}
if(x!=1) nr*=2;
return nr;
}
int Sdiv(int x)
{
if(x==1) return 1;
int s=1,d=3,p=0,r,prod;
while(x%2==0)
{
x/=2;
p++;
}
if(p)
{
p++;
while(p)
{
s*=2;
p--;
}
s--;
p=1;
}
r=sqrt(x);
while(d<=r)
{
p=0;
prod=1;
while(x%d==0)
{
p++;
x/=d;
}
if(p)
{
p++;
r=sqrt(x);
while(p)
{
prod*=d;
p--;
}
prod=(prod-1)/(d-1);
s*=prod;
}
d+=2;
}
if(!p) s=x+1;
else
if(x!=1)
s*=(d*d-1)/(d-1);
return s%9973;
}
int main()
{
ifstream f("ssnd.in");
ofstream g("ssnd.out");
int i,t,n;
f>>t;
for(i=1;i<=t;i++)
{
f>>n;
g<<FactPrim(n)<<" "<<Sdiv(n)<<"\n";
}
f.close();
g.close();
return 0;
}