Cod sursa(job #932642)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 29 martie 2013 08:37:29
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <fstream>
#define In "sumdiv.in"
#define Out "sumdiv.out"
#define mod 9901
using namespace std;

int sum;
int a,b;
inline int Pow_log(int x,int n)
{
    int p=1;
    while(n)
    {
        if(n&1)
        {
            n--;
            p = (p*x % mod ) %mod;
        }
        n>>=1;
        x = (x%mod*x%mod)%mod;
    }
    return p;
}

inline void Rezolvare()
{
    int d=2,putere,x,p;
    sum = 1;
    if(a%d==0)
    {
        putere=0;
        while(a%d==0)
        {
            putere++;
            a/=d;
        }
        putere*=b;
        putere++;
        p = Pow_log(d,putere)-1;
        if(p<0)
            p+=mod;
        x = Pow_log(d-1,mod-2);
        p= (p*x)% mod ;
        sum = (sum* p% mod) %mod;
    }
    d = 3;
    while(d*d<=a && a>1)
    {
         if(a%d==0)
        {
            putere = 0;
            while(a%d==0)
            {
                putere++;
                a/=d;
            }
            putere*=b;
            putere++;
            p = Pow_log(d,putere)-1;
            if(p<0)
                p+=mod;
            x = Pow_log(d-1,mod-2);
            p= (p*x)% mod ;
            sum = (sum* p% mod) %mod;
        }
        d+=2;
    }
    if(a>1)
    {
        p = Pow_log(a,b+1)-1;
        if(p<0)
            p+=mod;
        x = Pow_log(a-1,mod-2);
        p= (p*x)% mod ;
        sum = (sum* p% mod) %mod;
    }
}
int main()
{
    ifstream fin(In);
    fin>>a>>b;
    fin.close();
    if(a!=0)
        Rezolvare();
    ofstream fout(Out);
    fout<<sum<<"\n";
    fout.close();
    return 0;
}