Cod sursa(job #2608126)

Utilizator bmc213Mihai Cosmin bmc213 Data 30 aprilie 2020 17:06:02
Problema Suma divizorilor Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <bits/stdc++.h>
#define mod 9901

using namespace std;

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

const int N = 7072;

vector <int> v;
bool w[N];
int n, m;

void pre()
{
    for(int i = 2; i <= N; ++ i)
    {
        if(!w[i])
        {
            v.push_back(i);
            for(int j = i + i; j <= N; j += i)
                w[j] = 1;
        }
    }
}

int lgput(int a, int b)
{
    long long r = 1;
    while(b)
    {
        if(b % 2 == 1)
            r = ( r % mod * a % mod ) % mod;
        a = ( a % mod * a % mod ) % mod;
        b /= 2;
    }
    return r;
}

int sum_div(int x)
{
    long long sumdiv = 1, nr, fm;
    int q = 0;
    do
    {
        fm = 0;
        nr = 1;
        while(x % v[q] == 0)
        {
            x /= v[q];
            fm ++;
            nr = nr * v[q];
        }
        if(fm > 0)
            sumdiv = ( sumdiv * (v[q] * nr - 1) / (v[q] - 1)) % mod;
        q ++;
        if(v[q] * v[q] > x && x > 1)
        {
            sumdiv = ( sumdiv * (v[q] + 1) ) % mod;
            x = 1;
        }
    }while(x > 1);
    return sumdiv;
}
int main()
{
    pre();
    f >> n >> m;
    g << sum_div(lgput(n, m));
    return 0;
}