Cod sursa(job #923011)

Utilizator PatrikStepan Patrik Patrik Data 22 martie 2013 19:31:25
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
    #include<cstdio>
    #include<vector>
    #include<cmath>
    #include<fstream>
    using namespace std;
    #define LIM 1000001
    #define MOD 9901
    #define pb push_back
    int s , pu ;
    int A,B,d;
    vector<int>p;
    bool v[LIM];

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

    int main()
    {
        ciur();
        ifstream f("sumdiv.in");
        ofstream g("sumdiv.out");
            f>>A>>B;
            s = 1;
            for(int j = 0 ; j < (int)p.size() && 1ll*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)))%MOD;
            g<<s<<"\n";
        return 0;
    }

    void ciur()
    {
        p.pb(2);
        for(int i = 3 ; i <= LIM ; i+=2 )
        {
            if(v[i])continue;
            p.pb(i);
            for(long long j = 1ll*i*i ; j <= LIM ; j+= i<<1 )
                v[j] = 1;
        }
    }

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