Cod sursa(job #1563892)

Utilizator tudi98Cozma Tudor tudi98 Data 7 ianuarie 2016 01:10:43
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <bits/stdc++.h>
using namespace std;
#define Mod 9901

int a,b;
vector<int> Factor;
vector<int> Power;

void GetFactor(int a) {
    Factor.push_back(1);
    Power.push_back(1);
    int factMax = static_cast<int>(sqrt(static_cast<double>(a)));
    int aa = a;
    for (int i = 2; i <= factMax; i++)
        if (a % i == 0) {
            Factor.push_back(i);
            Power.push_back(0);
            while (a % i == 0) a /= i, ++Power.back();
        }
    if (Factor.size() == 1) Factor.push_back(aa), Power.push_back(1);
}

int log_put(int n,int p) {
    if (p == 0) return 1;
    if (p&1) return 1LL * n * log_put(1LL*n*n%Mod,p>>1) % Mod;
    return log_put(1LL*n*n%Mod,p>>1);
}

int main()
{
    ifstream fin("sumdiv.in");
    ofstream fout("sumdiv.out");

    fin >> a >> b;

    GetFactor(a);
    for (int& i : Power)
        i *= b;

    int Sum = 1;
    for (int i = 1; i < Factor.size(); i++) {
        int add1 = log_put(Factor[i],Power[i]+1) - 1;
        if (add1 < 0) add1 += Mod;
        int add2 = log_put(Factor[i]-1,Mod-2);
        Sum = 1LL * Sum * add1 % Mod * add2 % Mod;
    }


    fout << Sum;
}