Cod sursa(job #1366983)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 1 martie 2015 15:24:42
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 kb
#include <iostream>
#include <vector>
#include <string.h>
#include <fstream>
#include <bitset>

using namespace std;

ifstream fin("ssnd.in");
ofstream fout("ssnd.out");

const int maxn = 1000005;
const int mod = 9973;

bitset <maxn> used;
vector <int> primes;
int n;

inline void ciur() {
    primes.push_back(2);
    for(int i = 3 ; i < maxn ; i += 2) {
        if(used[i])
            continue;
        primes.push_back(i);
        /// cerr << i << '\n';
        for(int j = i + i ; j < maxn ; j += i)
            used[j] = 1;
    }
}

inline int lgpow(int a, int b) {
    int ans = 1;
    a %= mod;
    for( ; b ; b >>= 1) {
        if(b & 1)
            ans = (1LL * ans * a) % mod;
        a = (1LL * a * a) % mod;
    }
    return ans;
}

inline int invmod(int x) {
    return lgpow(x, mod - 2);
}

inline void solve(int x) {
    int nr = 1, sum = 1;
    for(int i = 0 ; i < primes.size() && primes[i] * primes[i] <= x ; ++ i) {
        if(x % primes[i])
            continue;
        int power = 0;
        while(x % primes[i] == 0) {
            ++ power;
            x /= primes[i];
        }
        nr = (1LL * nr * (power + 1)) % mod;
        int a = lgpow(primes[i], power + 1) - 1;
        if(a < 0)
            a += mod;
        int b = invmod(primes[i] - 1);
        sum = (1LL * sum * a * b) % mod;
    }
    if(x > 1) {
        int a = lgpow(x, 2) - 1;
        nr = (1LL * nr * 2) % mod;
        if(a < 0)
            a += mod;
        int b = invmod(x - 1);
        sum = (1LL * sum * a * b) % mod;
    }
    fout << nr << ' ' << sum << '\n';
}

int main() {
    ciur();
    fin >> n;
    for(int i = 1 ; i <= n ; ++ i) {
        int x;
        fin >> x;
        solve(x);
    }
}