Cod sursa(job #481609)

Utilizator Mishu91Andrei Misarca Mishu91 Data 31 august 2010 22:13:03
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <cassert>
#include <algorithm>
using namespace std;

const char iname[] = "ssnd.in";
const char oname[] = "ssnd.out";

const int MAX_SQRTN = 1000005;

typedef long long i64;

bitset<MAX_SQRTN> non_prime;

vector <int> primes;

int get_to_power(int d, int p) {
    i64 ans = 1;
    for (int i = 30; i >= 0; -- i)
        ans = ((p >> i) & 1) ? (ans * ans * d) % 9973 : (ans * ans) % 9973;
    return (int) ans;
}

int main(void) {
    for (int i = 2; i <= MAX_SQRTN / 2; ++ i) if (!non_prime[i]) {
        for (int j = i + i; j <= MAX_SQRTN; j += i)
            non_prime[j] = true;
    }
    for (int i = 2; i <= MAX_SQRTN; ++ i) if (!non_prime[i])
        primes.push_back(i);

    ifstream in(iname);
    ofstream out(oname);
    int t;
    assert(in >> t);
    assert(1 <= t && t <= 1000);
    while (t --) {
        i64 n, m;
        assert(in >> n);
        assert(1 <= n && n <= 1000000000000LL);
        i64 d_cnt = 1, d_sum = 1;
        for (int i = 0; i < (int) primes.size() && (i64) primes[i] * primes[i] <= n; ++ i) {
            if (n % primes[i])  continue ;
            int d = 0;
            while (n % primes[i] == 0)
                ++ d, n /= primes[i];
            d_cnt = (d_cnt * (d + 1)) % 9973;
            int a = (get_to_power(primes[i], d + 1) - 1) % 9973;
            if (a < 0)  a += 9973;
            int b = (get_to_power(primes[i] - 1, 9971)) % 9973;
            if (b < 0)  b += 9973;
            d_sum = (((d_sum * a) % 9973) * b) % 9973;
        }
        if (n > 1) {
            d_cnt = (d_cnt * 2) % 9973;
            int a = (get_to_power(n, 2) - 1) % 9973;
            if (a < 0)  a += 9973;
            int b = (get_to_power(n - 1, 9971)) % 9973;
            if (b < 0)  b += 9973;
            d_sum = (((d_sum * a) % 9973) * b) % 9973;
        }
        out << d_cnt << " " << d_sum << "\n";
    }
    in.close();
    out.close();
    return 0;
}