Cod sursa(job #2929370)

Utilizator andiRTanasescu Andrei-Rares andiR Data 25 octombrie 2022 18:35:04
Problema Suma divizorilor Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.46 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;
    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;
        sol=sol*p%MOD;
        sol=sol*invmod(baza[i]-1)%MOD;
    }
    fout<<sol;
    return 0;
}