Cod sursa(job #1913898)

Utilizator Corneliu10Dumitru Corneliu Corneliu10 Data 8 martie 2017 14:36:54
Problema Suma divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <vector>
#define MOD 9901

using namespace std;

vector<pair<int, int> > p_fact;

int rid_putere(int A, int n)
{
    long long p = 1;
    while(n)
    {
        if(n & 1)
        {
            n--;
            p = (p * A) % MOD;
        }
        A = (A * A) % MOD;

        n>>=1;
    }
    return p;
}

int main()
{
    int np=0,A,B,i;
    freopen("sumdiv.in","r",stdin);
    freopen("sumdiv.out","w",stdout);

    scanf("%d%d",&A,&B);

    //prime factorization A
    if(A%2==0)
    {
        np++;
        p_fact.push_back(make_pair(2,1));
        A=A/2;
        while(A%2==0)
        {
            p_fact[0].second++;
            A=A/2;
        }
    }
    for(i=3;i*i<=A;i+=2)
    {
        if(A%i==0)
        {
            np++;
            p_fact.push_back(make_pair(i,1));
            A=A/i;
            while(A%i==0)
            {
                p_fact[np-1].second++;
                A=A/i;
            }
        }
    }
    if(A>1)
    {
        np++;
        p_fact.push_back(make_pair(A,1));
    }

    //

    long long m,sol = 1;
    for(i=0;i<np;i++)
    {
        m = p_fact[i].second*B;
        sol = (sol * rid_putere(p_fact[i].first,m+1) - 1) % MOD;
        sol = (sol * rid_putere(p_fact[i].first - 1, MOD - 2) ) % MOD;
    }

    printf("%ld",sol);
}