Cod sursa(job #2930983)
Utilizator | Data | 29 octombrie 2022 23:04:32 | |
---|---|---|---|
Problema | Suma divizorilor | Scor | 40 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 2.01 kb |
#include <iostream>
#include <fstream>
using namespace std;
#define Nr 9901
void euclid(int a, int b, int &x, int &y)
{
if(b==0)
{
x=1;
y=0;
}
else
{
int x0, y0;
euclid(b, a%b, x0, y0);
x=y0;
y=x0-(a/b)*y0;
}
}
int main()
{
ifstream in("sumdiv.in");
ofstream out("sumdiv.out");
int a, b, exp, d, s=0, x, y, rez, cd;
in>>a>>b;
if(a==1) out<<1;
else
{
if(b==0) out<<1;
else
{
d=2;
while(d*d<=a)
{
cd=d;
while(a%d==0)
{
a=a/d;
exp++;
}
if(exp>0)
{
exp*=b;
exp+=1;
rez=1;
while(exp>0)
{
if(exp%2==1)
rez=(rez*d)%Nr;
d=(d*d)%Nr;
exp=exp/2;
}
rez=rez-1;
if(rez<1) rez+=Nr;
euclid(cd-1, Nr, x, y);
if(x<0) x+=Nr;
s=(s+(rez*x)%Nr)%Nr;
}
exp=0;
d=cd;
d++;
}
if(a>1)
{
exp=1;
d=a;
exp*=b;
exp+=1;
rez=1;
while(exp>0)
{
if(exp%2==1)
rez=(rez*d)%Nr;
d=(d*d)%Nr;
exp=exp/2;
}
rez=rez-1;
if(rez<1) rez+=Nr;
d=a;
euclid(d-1, Nr, x, y);
if(x<0) x+=Nr;
s=(s+(rez*x)%Nr)%Nr;
}
out<<s;
}
}
return 0;
}