Cod sursa(job #1766973)

Utilizator TimitocArdelean Andrei Timotei Timitoc Data 28 septembrie 2016 17:35:15
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <iostream>
#include <cstdio>
#define MOD 9901

using namespace std;

int rise(int x, int p)
{
    int nr = 1;
    for (int i = 0; p>>i; i++) {
        if ((p>>i) & 1)
            nr = (1LL * nr * x) % MOD;
        x = (1LL*x*x) % MOD;
    }
    return nr;
}

int invers(int x)
{
    return rise(x, MOD-2);
}
int a, b;
int p[100], e[100], nq;
void citire()
{
	scanf("%d %d", &a, &b);
    for (int i = 2; i*i <= a; i++)
		if (a % i == 0) {
			p[++nq] = i;
            while (a % i == 0) {
				e[nq]++;
				a /= i;
            }
		}
    if (a > 1) {
		p[++nq] = a;
		e[nq] = 1;
    }
}

void solve()
{
	int rez = 1;
    for (int i = 1; i <= nq; i++)
        rez = (1LL*rez*(rise(p[i], e[i]*b+1)-1)*invers(p[i]-1))%MOD;
	printf("%d", rez);
}

int main()
{
    freopen("sumdiv.in", "r", stdin);
    freopen("sumdiv.out", "w", stdout);

	citire();
    solve();

    return 0;
}