Cod sursa(job #2118963)

Utilizator patcasrarespatcas rares danut patcasrares Data 31 ianuarie 2018 13:47:09
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.1 kb
#include<fstream>
#include<iostream>
#define DN 8005
#define M 9901
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
int a,b,v[DN],r[DN],nr,f,rez=1;
int ve(int a,int b)
{
    int c,p,f=1;
    while(b)
    {
        p=1;
        c=a;
        while(1)
        {
            if(1LL*2*p>b)
                break;
            p=2*p;
            c=(c*c)%M;
        }
        b-=p;
        f=(f*c)%M;
    }
    return f;
}
int main()
{
    fin>>a>>b;
    for(int i=2;i<DN;i++)
        if(v[i]==0)
        {
            nr++;
            r[nr]=i;
            for(int j=2*i;j<DN;j+=i)
                v[j]=1;
        }
    for(int i=1;r[i]*r[i]<=a;i++)
        if(a%r[i]==0)
        {
            f=0;
            while(a%r[i]==0)
            {
                f++;
                a/=r[i];
            }
            f=f*b;
            rez=(rez*((ve(r[i],f+1)-1+M)%M))%M;
            rez=(rez*ve(r[i]-1,M-2))%M;
        }
    if(a)
    {
        f=b;
        rez=(rez*((ve(a,f+1)-1+M)%M))%M;
        rez=(rez*ve(a-1,M-2))%M;
    }
    fout<<rez;
}