Mai intai trebuie sa te autentifici.
Cod sursa(job #1900569)
Utilizator | Data | 3 martie 2017 14:55:08 | |
---|---|---|---|
Problema | Suma divizorilor | Scor | 20 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.22 kb |
#include <cstdio>
#define n 9901
using namespace std;
long long int a, b;
int nr;
int putere(long long int a, long long int b)
{
if(b==0)
return 1;
if(b%2==0)
return putere(a*a, b/2)%n;
return a*putere(a, b-1)%n;
}
void inv(int a, int b, int &k, int &l)
{
if(b==0)
{
l=1;
k=0;
return;
}
int k1, l1;
inv(b, a%b, k1, l1);
l=k1;
k=l1-(a/b)*k1;
}
int prog(int p, int f)
{
int k, l;
inv(p-1, n, k, l);
return ((putere(p, f+1)-1)*l)%n;
}
int sdiv()
{
int s=1;
long long d=3, p=0;
while(a%2==0)
{
p++;
a/=2;
}
if(p)
s=(s*prog(2, p*b))%n;
while(d*d<=a)
{
p=0;
while(a%d==0)
{
p++;
a/=d;
}
if(p)
s=(s*prog(d, p*b))%n;
d+=2;
}
if(a>1)
s=(s*prog(a, b))%n;
return s;
}
int main()
{
freopen("sumdiv.in", "r", stdin);
freopen("sumdiv.out", "w", stdout);
scanf("%lld %lld", &a, &b);
if(a==0)
printf("0");
else
{
int rez=sdiv();
printf("%d", rez);
}
return 0;
}