Cod sursa(job #1745181)

Utilizator flaviu_2001Craciun Ioan-Flaviu flaviu_2001 Data 21 august 2016 14:01:32
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <fstream>
#include <vector>
#define REST 9973

using namespace std;

bool b[1000006];
vector<long long> v;
vector<int> pr;

void read();
void sieve();
void solve();
int pow(int, int);

int main(){
    read();
    sieve();
    solve();
    return 0;
}

void read(){
    ifstream fin ("ssnd.in");
    long long x;
    int test;
    fin >> test;
    while (test--)
        fin >> x,
        v.push_back(x);
    fin.close();
}

void sieve(){
    for (int d = 2; d * d <= 1000001; ++d)
        if (!b[d])
            for (int i = d * d; i <= 1000001; i += d)
                b[i] = 1;
    for (int i = 2; i <= 1000001; ++i)
        if (!b[i])
            pr.push_back(i);
}

void solve(){
    ofstream fout ("ssnd.out");
    for (unsigned int i = 0; i < v.size(); ++i){
        long long n = v[i];
        int nr(1), sm(1);
        for (unsigned int j = 0; j < pr.size() && pr[j] * pr[j] <= n; ++j){
            if (n % pr[j])
                continue;
            int r = 0;
            while(!(n % pr[j]))
                n /= pr[j],
                ++r;
            nr *= (r+1);
            int p1 = (pow(pr[j], r+1)-1) % REST;
            int p2 = (pow(pr[j]-1, REST-2)) % REST;
            sm = (((sm * p1)%REST)*p2)%REST;
        }
        if (n > 1)
            nr *= 2,
            sm = (1LL * sm * (n+1)%REST);
        fout << nr << " " << sm << "\n";
    }
    fout.close();
}

int pow(int x, int y){
    int r = 1;
    x %= REST;
    for (; y; y >>= 1){
        if (y & 1)
            r *= x,
            r %= REST;
        x *= x;
        x %= REST;
    }
    return r;
}