Cod sursa(job #2929507)

Utilizator andiRTanasescu Andrei-Rares andiR Data 25 octombrie 2022 23:30:24
Problema Suma divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.81 kb
#include <iostream>
#include <fstream>

#define MOD 9901
#define SqrtA 7071
using namespace std;
ifstream fin ("sumdiv.in");
ofstream fout ("sumdiv.out");
short nrprime,nrfact;
int a,b,i,j,sol=1,p;
bool ciur[SqrtA+1];
int prim[SqrtA/5], baza[SqrtA/5], ex[SqrtA/5];
int pow(int n,int p){
    if (p==1)
        return n;
    else if (p%2==0)
        return pow((long long)n*n%MOD,p/2);
    return (long long)n*pow((long long)n*n%MOD,p/2)%MOD;
}
int invmod(int nr){
    return pow(nr, MOD-2);}

int main()
{
    ///precalculare ciur
    ciur[0]=ciur[1]=1;
    for (i=4;i<=SqrtA;i+=2)
        ciur[i]=1;
    for (i=3;i*i<=SqrtA;i+=2)
        if (ciur[i]==0)
            for (j=i*i;j<=SqrtA;j+=i)
                ciur[j]=1;
    for (i=2;i<=SqrtA;i++)
        if (ciur[i]==0)
            prim[nrprime++]=i;
    ///descompunere a in fact primi
    fin>>a>>b;
    if (a==0)
        fout<<'0';
    else if (b==0)
        fout<<'1';
    else{
        i=0;
        while (a!=1 && i<nrprime){
            if (a%prim[i]==0){
                baza[nrfact]=prim[i];
                while (a%prim[i]==0){
                    a/=prim[i];
                    ex[nrfact]++;
                }
                nrfact++;
            }
            i++;
        }
        if (a>1){
            baza[nrfact]=a;
            ex[nrfact++]=1;
        }
        for (i=0;i<nrfact;i++)
            ex[i]*=b;
        ///luam fiecare baza si exponent in parte
        for (i=0;i<nrfact;i++){
            p=pow(baza[i], ex[i]+1)-1;
            if (p==0){
                p=(ex[i]+1)%MOD;
            }
            else{
                if (p<0)
                    p+=MOD;
                sol=sol*invmod(baza[i]-1)%MOD;
            }
            sol=sol*p%MOD;
        }
        fout<<sol;
    }
    return 0;
}