Cod sursa(job #1174617)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 23 aprilie 2014 16:36:39
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <fstream>

using namespace std;
const int mod=9901;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
inline int putere(int a,long long p)
{
    int result=1;
    while(p)
    {
        if(p&1) result=(1LL*result*a)%mod;
        a=(1LL*a*a)%mod;
        p>>=1;
    }
    return result;
}
struct desc
{int fact,cat;} v[25];
int main()
{
    int a,b,k=0,div=0,i,inv,sum,tot=1;
    fin>>a>>b;
    if(!(a&1))
    {
        v[++k].fact=2;
        while( !(a&1) ) div++,a>>=1;
        v[k].cat=div;
    }
    for(i=3;i*i<=a;i++)
    {
        div=0;
        while(a%i==0) div++,a/=i;
        if(div>0) v[++k].fact=i,v[k].cat=div;
    }
    if(a>1) v[++k].fact=a,v[k].cat=1;
    for(i=1;i<=k;i++)
    {
        sum=(putere(v[i].fact,1LL*b*v[i].cat+1)-1+mod)%mod;
        inv=putere(v[i].fact-1,1LL*(mod-2))%mod;
        tot*=(1LL*sum*inv)%mod;
    }
    fout<<tot;
}