Cod sursa(job #756726)

Utilizator Theorytheo .c Theory Data 10 iunie 2012 12:43:41
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<fstream>
#define mod 9901
#define ll long long
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
long long A, B, S;

ll put(ll b, ll p)

{
    ll R,X,i;

    b%=mod;

    for (i=1,R=1,X=b;i<=p;i<<=1)

    {

        if (i&p) R=R*X%mod;

         X=X*X%mod;

    }

    return R%mod;

}
long long desc(ll x, ll nr)
{
    nr *= B;
    ll aux1 = (put(x, nr + 1ll) - 1+ mod ) % mod;



    ll aux2 = put(x - 1ll, mod - 2ll) % mod;

    return (aux1 * aux2) %mod;
}
void read()
{
    S = 1;
    fin >>A>>B;
    if(A %  mod ==0 || A == 1|| B == 0 )
    {
        fout<< 1; return ;
    }
    if( A == 0)
    {
        fout<< 0 ; return ;
    }

    for(int i = 2; i * i <= A and A > 1 ; ++i)
    {
        if(A % i == 0)
        {
           ll nr = 0;
            while(A % i == 0 && A > 1)
                A /= i, ++nr;
            if(i % mod == 1)
            {
             S = S * (nr * B + 1ll)% mod;
             continue;
            }
            long long K = desc(i, nr) %mod;

            S = (S * K )% mod;
        }

    }
    //fout << put( 2, 10) ;
    if(A > 1){if(A % mod == 1)
            {
             S = S * (1 * B + 1ll)% mod;

            }
            else
        S = (S * desc(A, 1)) % mod;
    }
    fout <<S;

}
int main()
{

    read();
    fin.close();
    return 0;
}