Cod sursa(job #1065080)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 22 decembrie 2013 19:00:26
Problema Suma divizorilor Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>


const int p = 9901;

// euclid extins => d = gcd(a, b) = ax + by
int gcd(int a, int b, int *x, int *y)
{
    if (b == 0)
    {
        *x = 1;
        *y = 0;
        return a;
    }
    else
    {
        int xp, yp;
        int d = gcd(b, a%b, &xp, &yp);

        *x = yp;
        int m = ((long long)((a/b) % p) * (long long) yp) % p;
        *y = (xp - m + p) % p;

        // atentie aici
        // operatiile trebuie efectuate modulo p
        // fie p foarte mare: 10 000 000 007
        // 0 <= yp < p              incape in int   
        // 0 <= ((x/y) % p) < p     incape in int

        return d;
    }
}

int pow(n, x)
{
    if (x == 0)
    {
        return 1;
    }
    else if (x == 1)
    {
        return n;
    }
    else 
    {
        int power = pow(n, x/2) * pow(n, x/2) % p;
        if (x%2)
            power = power * n % p;
            
        return power;    
    }    
}

int main()
{
    int a, b, s;
    int i, power;
    freopen("sumdiv.in", "r", stdin);
    freopen("sumdiv.out", "w", stdout);
    
    scanf("%d %d", &a, &b);
    
    power = pow(a, b);
    
    s = 1 + power; // 1 | a si a | a      
    for (i = 2; i <= power/2; ++i)
    {
        if ((power%i) == 0)
        {
            s += i;
            s %= p;
        }
    }
    
    printf("%d\n", s);
}