Cod sursa(job #2141052)

Utilizator felixiPuscasu Felix felixi Data 24 februarie 2018 09:22:54
Problema Suma divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <bits/stdc++.h>

using namespace std;

typedef long long I64;
const I64 MOD  = 9901;

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

I64 lgput(I64 b, I64 p)
{
    I64 r = 1;
    while(p)
    {
        if(p & 1)
            r = r * b % MOD;
        b = b * b % MOD;
        p >>= 1;
    }
    return r;
}

I64 geom(I64 b, I64 p)
{
    if( p == 0 ) return 1;
    if( p == 1 ) return (b + 1) % MOD;
    if( p % 2 == 1 ) {
        return (1 + lgput(b, p/2 + 1)) * geom(b, p / 2) % MOD;
    }
    else {
        return (1 + 1LL * b * (1 + lgput(b, p/2)) * geom(b, p/2));
    }
}

int main()
{
    I64 a, b;
    in >> a >> b;
    if( a + b == 0 ) {
        out << "0\n";
        return 0;
    }
    if( b == 0 ) {
        out << "1\n";
        return 0;
    }
    if( a == 0 ) {
        out << "0\n";
        return 0;
    }
   /* if( a == 1 ) {
        out << b + 1 << '\n';
        return 0;
    }*/
    I64 r = 1;
    for( I64 ind = 2;  ind * ind <= a;  ++ind ) {
        if( a % ind == 0 ) {
            I64 cnt = 0;
            while(a % ind == 0) {
                ++cnt;
                a /= ind;
            }
            if( ind % MOD == 1 ) {
                r = r * (cnt * b + 1) % MOD;
            }
            else if( ind % MOD != 0 ) {
                r = r * (lgput(ind, cnt * b + 1) - 1 + MOD) * lgput(ind - 1, MOD - 2) % MOD;
            }
        }
    }
    if( a > 1 ) {
        if( a % MOD == 1 ) {
            r = r * (1 * b + 1) % MOD;
        }
        else if( a % MOD != 0 ) {
            r = r * (lgput(a, 1 * b + 1) - 1 + MOD) * lgput(a - 1, MOD - 2) % MOD;
        }
    }
    assert(r != 0);
    out << r << '\n';
    return 0;
}