Cod sursa(job #1387813)
Utilizator | Data | 14 martie 2015 18:24:57 | |
---|---|---|---|
Problema | Suma divizorilor | Scor | 50 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.37 kb |
#include<fstream>
#include<math.h>
#define nmax 8002
using namespace std;
int ciur[nmax];
long long a,b,db,diviz,s,j,y,i,p,aa,d;
inline long long gcd( long long A, long long B, long long &X, long long &Y )
{
if (B == 0)
{
X = 1;
Y = 0;
return A;
}
long long X0, Y0, D;
D = gcd( B, A % B, X0, Y0 );
X = Y0;
Y = X0 - (A / B) * Y0;
return D;
}
int main ()
{
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
ciur[1]=1;
fin>>a>>b;
if(a>1)
{
y=sqrt(a)+1;
s=1;
for(i=2;i<=y;i++)
{
if(ciur[i]==0)
{
for(j=i*i;j<=y;j=j+i)
{
ciur[j]=1;
}
if(a%i==0)
{
diviz=0;
while(a%i==0)
{
diviz=diviz+1;
a=a/i;
}
if(diviz!=0)
{
diviz=diviz*b+1;
db=1;
p=i;
while(diviz!=0)
{
if(diviz%2==1)
{
db=(db*p)%9901;
}
p=(p*p)%9901;
diviz=diviz/2;
}
d=gcd(i-1,9901,p,j);
s=s*(db-1);
s=s%9901;
s=s*p;
s=s%9901;
}
}
if(a==1)
{
break;
}
}
}
if(a!=1)
{
j=1;
aa=a%9901;
b++;
while(b!=0)
{
if(b%2==1)
{
j=(j*aa)%9901;
}
aa=(aa*aa)%9901;
b=b/2;
}
d=gcd(a-1,9901,p,i);
s=s*(j-1);
s=s%9901;
s=s*p;
s=s%9901;
}
fout<<s;
}
else
{
fout<<a;
}
fin.close();
fout.close();
return 0;
}