Cod sursa(job #1174627)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 23 aprilie 2014 16:57:58
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream>

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