Cod sursa(job #2422442)

Utilizator StanCatalinStanCatalin StanCatalin Data 18 mai 2019 19:44:05
Problema Suma divizorilor Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream in("sumdiv.in");
ofstream out("sumdiv.out");

const int mod = 9901;

vector <int> prime;
int puteri[10000];
bool ciur[10000];

int a,b;


int ridica(int a,int b)
{
    int rasp = 1;
    while(b != 0)
    {
        if (b%2 == 1)
        {
            rasp = (rasp * (a%mod)) %mod;
            b--;
        }
        else
        {
            a = ((a)%mod*(a)%mod)%mod;
            b /= 2;
        }
    }
    return rasp;
}

void descomp(int a)
{
    int i,cnt;
    for (i=2; i*i<=a; i++)
    {
        if (a%i == 0)
        {
            prime.push_back(i);
            cnt = 0;
            while (a%i == 0)
            {
                cnt++;
                a /= i;
            }
            puteri[i] = cnt;
        }
    }
    if (a != 1)
    {
        puteri[a] = b;
        prime.push_back(a);
    }
}

int main()
{
    int j,suma = 0,prod = 1;
    in >> a >> b;
    if (a == 0)
    {
        out << "0";
        return 0;
    }
    if (a == 1)
    {
        out << "1";
        return 0;
    }
    if (b == 0)
    {
        out << "1";
        return 0;
    }
    descomp(a);
    vector <int>::iterator i;
    for (i=prime.begin(); i<prime.end(); i++)
    {
        suma = 0;
        for (j=0; j<=puteri[*i]; j++)
        {
            suma = suma + ridica(*i, j);
            suma %= mod;
        }
        prod = ((prod%mod)*(suma))%mod;
    }
    out << prod;
    return 0;
}