Cod sursa(job #2119005)

Utilizator patcasrarespatcas rares danut patcasrares Data 31 ianuarie 2018 15:18:49
Problema Suma divizorilor Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>
#include<iostream>
#define DN 8005
#define M 9901
using namespace std;
ifstream fin("sumdiv.in");
ofstream fout("sumdiv.out");
unsigned long long a,b,v[DN],r[DN],nr,f,rez=1;
long long ve(long long a,unsigned long long b)
{
    unsigned long long 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;
    if(a==0)
    {
        fout<<0;
        return 0;
    }
    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<=nr;i++)
        if(a%r[i]==0)
        {
            f=0;
            while(a%r[i]==0)
            {
                f++;
                a/=r[i];
            }
            f=f*b;
            cout<<f<<'\n';
            rez=(rez*((ve(r[i]%M,f+1)-1+M)%M))%M;
            rez=(rez*ve((r[i]%M-1+M)%M,M-2))%M;
        }
    if(a!=1)
    {
        f=b;
        rez=(rez*((ve(a%M,f+1)-1+M)%M))%M;
        rez=(rez*ve((a-1+M)%M,M-2))%M;
    }
    fout<<rez;
}