Cod sursa(job #1976345)

Utilizator valentinoMoldovan Rares valentino Data 3 mai 2017 09:51:52
Problema Suma divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <iostream>
#define NM 100005
#define mod 9901
using namespace std;

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

int d[NM], k, use[NM];

void ciur()
{
    for(int i = 2; i < NM; ++i)
    {
        if(!use[i])
        {
            d[++k] = i;
            for(int j = i + i; j < NM; j += i)
                use[j] = 1;
        }
    }
}

int pow(int n, long long p)
{
    long long ans = 1;
    n = n % mod;
    while(p)
    {
        if(p & 1) ans = (ans * n) % mod;
        n = (n * n) % mod;
        p >>= 1;
    }
    return ans;
}

int main()
{
    int n, b, sum = 1;
    long long  p, top, bot;
    f >> n >> b;
    ciur();
    for(int i = 1; i <= k && d[i] * d[i] <= n; ++i)
    {
        if(n % d[i]) continue;
        p = 0;
        while(n % d[i] == 0)
        {
            p++;
            n /= d[i];
        }
        p *= b;
        top = (pow(d[i], p + 1) + mod - 1) % mod;
        bot = pow(d[i] - 1, mod - 2) % mod;
        sum = (((sum * top) % mod) * bot) % mod;
    }
    if(n != 1)
    {
        top = (pow(n, b + 1) - 1) % mod;
        bot = pow(n - 1, mod - 2) % mod;
        sum = (((sum * top) % mod) * bot) % mod;
    }
    g << sum << '\n';

}