Cod sursa(job #1423892)

Utilizator SwagginInMyJaysaaaaaaaaaaaas SwagginInMyJays Data 22 aprilie 2015 22:43:25
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 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 llu unsigned long long
#define rep(i, a, b) for (int i = (a) ; i <= (b) ; ++i)

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

static const int NMAX = 1e6;

static const int MOD = 9973;

using namespace std;

bitset <NMAX> rpz;

vector <int> v;

void ciuruiala() {
    v . push_back (2);
    for (int i = 3 ; i <= NMAX; i+=2)
        rpz[i] = 1;
    for (int i = 3 ; i <= NMAX; i+=2)
    {
        if ( ! rpz[i])
            continue;
        v.push_back(i);
        for (int j = (i << 1) + i ; j <= NMAX; j += ( i << 1))
            rpz[j] = 0;
    }

}

inline int bitput (int  x, int  bit){
    int ans = 1;
    for (; bit; bit >>= 1, x = (x * x) % MOD)
            if (bit & 1) ans = (ans * x) % MOD;
            return ans % MOD;
}

inline pii Queryala (ll x) {
    int pow, ND, SD, numr, invers,  i;
    ND = SD = 1;
    for ( i = 0 ; i < (int)  v.size() && 1LL * v[i] * v[i] <= x; i++) {
            if (x % v[i]) continue;
            pow = 0;
            while (x % v[i] == 0 )
                ++pow, x/= v[i];
                ND*= (pow + 1);
                numr = (bitput(v[i], pow + 1) - 1 )% MOD;
                invers = bitput (v[i] - 1 , MOD - 2) % MOD;
                  SD = (SD*numr) % MOD;
                  SD = (SD*invers) % MOD;
    }

    if (  x > 1 ) {
            ND *= 2;
            SD = (1LL * SD * (x + 1) % MOD);
    }
    pii solve = mp (ND, SD);
    return solve;
}


int main(){
    ifstream fin ("ssnd.in");
    ofstream fout ("ssnd.out");
    int query;
    ll x;
    ciuruiala();
    for (fin >> query; query; query--) {
            fin >> x;
            int nrd = Queryala(x).fi, SSD = Queryala(x). se;
            fout << nrd << " " << SSD << "\n";
    }
    return 0;
}