Cod sursa(job #923440)

Utilizator PatrikStepan Patrik Patrik Data 23 martie 2013 16:38:22
Problema Suma divizorilor Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
    #include<cstdio>
    #include<vector>
    using namespace std;
    #define MAX 2500001
    #define pb push_back
    #define MOD 9901
    int A , B  , s , pu;
    vector<int> p;
    bool v[MAX];

    void ciur();
    int pow(int a, long long  b);

    int main()
    {
        s = 1;
        ciur();
        freopen("sumdiv.in" , "r" , stdin );
        scanf("%d%d" , &A , &B );
        for( int j = 0 ; j < (int)p.size() && p[j]*p[j] <= A ; ++j )
        {
            pu = 0;
            while(A%p[j]==0)
            {
                A/=p[j];
                pu++;
            }
            if(pu)
            s = (1ll*s*(pow(p[j],pu*B+1)-1)/(p[j]-1))%MOD;
        }
        if(A>1)s = (1ll*s*(pow(A,B+1)-1)/(A-1));
        freopen("sumdiv.out" , "w" , stdout );
        printf("%d" , s);
        return 0;
    }

    void ciur()
    {
        p.pb(2);
        for(int i = 3 ; i <= MAX ; i+=2)
        {
            if(v[i])continue;
            p.pb(i);
            for(int j = i*i ; j <= MAX && j > 0; j+=(i<<1))
                v[j] = 1;
        }
    }

    int pow (int a , long long b)
    {
        int rez = 1 , nr = a;
        for(int i = 0 ; (1<<i) <= b ; ++i)
        {
            if((1<<i)&b)
                rez = (1ll*rez*nr)%MOD;
            else
                nr = (1ll*nr*nr)%MOD;
        }
        return rez;
    }