Cod sursa(job #2057824)

Utilizator refugiatBoni Daniel Stefan refugiat Data 4 noiembrie 2017 19:50:01
Problema Suma divizorilor Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <iostream>
#include <fstream>
#define MOD 9901
using namespace std;
ifstream si("sumdiv.in");
ofstream so("sumdiv.out");
int p[500005];
long long e[500005];

int rput(int b,long long e)
{
    int p=1;
    while(e)
    {
        if(e&1)
            p=(1LL*b*p)%MOD;
        b=(1LL*b*b)%MOD;
        e>>=1;
    }
    return p;
}
int main()
{
    int n,b;
    si>>n>>b;
    if(b==0)
    {
        cout<<1;
        return 0;
    }
    int nr=0;
    for(int i=2;i*i<=n;++i)
    {
        if(n%i==0)
        {
            p[++nr]=i;
            while(n%i==0)
            {
                n/=i;
                e[nr]+=b;
            }
        }
    }
    if(n!=1)
    {
        p[++nr]=n;
        e[nr]=b;
    }
    int rez=1;
    for(int i=1;i<=nr;i++)
    {
        p[i]%=MOD;

        if(p[i]==1)
        {
            rez=rez*(e[i]+1)%MOD;
        }
        else
            if(p[i]!=0)
            {
                int a;
                a=rput(p[i],e[i]+1)-1;
                if(a<0)
                    a+=MOD;
                a=a*rput(p[i]-1,MOD-2)%MOD;
                rez=rez*a%MOD;
            }
    }
    so<<rez<<'\n';
    return 0;
}