Cod sursa(job #1363809)

Utilizator badea_adi1999Badea Adrian Catalin badea_adi1999 Data 27 februarie 2015 11:29:58
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#define n 9901
using namespace std;
ifstream f("sumdiv.in");
ofstream g("sumdiv.out");
long long sol=1;

void euclid(int a, int b, int &x, int &y)
{
    if (b==0) {
        x=1;
        y=0;
        return;
    }
    int x0,y0;
    euclid(b,a%b,x0,y0);
    x=y0;
    y=x0 - y0 * (a/b);

}
int im(int k)
{
    int x,y;
    euclid(k,n,x,y);
    return (x%n+n)%n;

}
int exponentiere(int a, int b)
{
    if (b==0)
        return 1;
    int x=exponentiere(a,b/2);
    if (b%2==0)
        return x*x%n;
    else
        return a*x%n*x%n;


}
void solve(int p , int q)
{
    long long x=exponentiere(p,q+1)-1;
    if (x<0)
        x+=n;
    if (x!=0) {
        sol*=1LL*x;
        sol%=n;
        if (p>1)
            sol*=1LL*im(p-1);
        sol%=n;
    }

}
int main()
{
    int i,j,a,b,e;
    long long p=1;
    f>>a>>b;

    p=2;
    while (a-1) {
        if (a%p==0) {
            e=1;
            a/=p;
            while (a%p==0) {
                a/=p;
                e++;
            }
            solve(p%n,e*b);
        }
        else
            if (p*p>a) {
                solve(a%n,b);
                a=1;
            }
        p++;
    }
    g<<sol;
    return 0;
}