Cod sursa(job #1156068)

Utilizator PatrikStepan Patrik Patrik Data 27 martie 2014 13:11:14
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
    #include<cstdio>
    #include<vector>
    using namespace std;
    #define MOD 9901
    #define MAX 10001
    #define pb push_back
    int A , B  , k , d[MAX] , a[MAX] , prod[MAX] , sol ;
    bool u[MAX];
    vector<int > p;

    int powMod(int a , int n)
    {
        if( n == 0) return 1;
        if(n == 1) return a;
        if(n%2) return (a*powMod((a*a)%MOD,(n-1)/2))%MOD;
        else return powMod((a*a)%MOD,n/2)%MOD;
    }

    void ciur ()
    {
        p.pb(2);
        for(int i = 3 ; i < MAX ; i+=2 )
            if(!u[i])
        {
            for(int j = i*3 ; j < MAX ; j+=2*i)
                u[j] = 1;
            p.pb(i);
        }
    }

    int main()
    {
        freopen("sumdiv.in" , "r" , stdin );
        freopen("sumdiv.out" , "w" , stdout );
        scanf("%d%d"  , &A , &B );
        ciur();
        for(int i = 0 ; p[i]*p[i] <= A ; ++i )
        {
            if(A%p[i]==0)
                d[++k] = p[i];
            while(A%p[i] == 0)
            {
                A/=p[i];
                a[k]++;
            }
        }
        if(A > 1)
        {
            d[++k] = A%MOD;
            a[k] = 1;
        }
        for(int i = 1 ; i <= k ; ++i )
            prod[i] =  ((powMod(d[i],a[i]*B+1)-1) * powMod(d[i]-1,MOD-2))%MOD;
        sol = 1;
        for(int i = 1 ; i<= k ; ++i )
            sol  = (sol*prod[i])%MOD;
        printf("%d" , sol );
        return 0;
    }