Cod sursa(job #1429290)

Utilizator SwagginInMyJaysaaaaaaaaaaaas SwagginInMyJays Data 5 mai 2015 23:21:37
Problema Suma divizorilor Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>
#include <fstream>
#include <cstdlib>
#include <utility>
#include <algorithm>
#include <bitset>
#include <vector>
#include <map>
#include <queue>
#include <string>
#include <cstring>

#define ll long long
#define rep(i, a, b) for (int i = (a) ; i <= (b) ; ++i)
#define mask(x) ((x) ^ ((x) >> 1 ) )

#define mp make_pair
#define pii pair <int, int>
#define SORT(x) sort ((x).begin(), (x).end() )

using namespace std;

static const int modus = 9901;

inline int bitput (int a, int b) {
    ll rez  = 1;
    for (; b ; b >>= 1 ) {
            if (b & 1 ) rez = (rez * a ) % modus;
            a = (1LL * a * a ) % modus;
    }
    return rez;
}
inline int ssd (int X, int Y) {
    return ( ( (bitput (X, Y + 1) - 1 + modus ) % modus ) * bitput((X-1)%modus, modus-2)) % modus;//I love bad bitches, thats my fucking problem
}
int main() {
    ifstream cin ("sumdiv.in");
    ofstream cout ("sumdiv.out");
    int X, Y;
    ll mask = 1;
    cin >> X >> Y ;
    for (auto d = 2; d * d <= X; ++ d ) {
            if (X % d) continue;
            int p = 0;
            while (X % d == 0) ++p, X /= d;
            p *= Y;
            if (d % modus == 1)
                    mask = (mask * ((p + 1) % modus) ) % modus;
                    else
            mask = (mask * ssd(d, p) ) % modus;
    }
      if (X > 1) {
            if (X % modus == 1) mask = (mask *  ( ( Y + 1) % modus) ) % modus;
            else mask = (mask * ssd(X, Y + 1)) % modus;
    }
cout << mask;

    return 0;
}