Cod sursa(job #1358972)

Utilizator somuBanil Ardej somu Data 24 februarie 2015 20:47:27
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#define mod 9973
#define nmax 1000005
#define ll long long

using namespace std;

ll t, n;
vector <ll> P;
bool viz[nmax];

void ciur() {
    for (ll i = 2; i < nmax; i++)
        if (!viz[i]) {
            P.push_back(i);
            for (ll j = 2 * i; j < nmax; j += i)
                viz[j] = true;
        }
}

int main() {
    
    ifstream fin("ssnd.in");
    ofstream fout("ssnd.out");
    
    ciur();
    
    fin >> t;
    for (ll k = 1; k <= t; k++) {
        fin >> n;
        
        ll nrDiv = 1;
        ll sum = 1;
        ll len = sqrt(n);
        
        for (ll i = 0; P[i] <= len; i++) {
            if (n % P[i] == 0) {
                
                ll nr = 1;
                ll aux = n;
                
                while (n % P[i] == 0) {
                    nr++;
                    n /= P[i];
                }
                
                nrDiv *= nr;
                sum *= (aux / n) * P[i] - 1;
                sum /= (P[i] - 1);
                sum %= mod;
                len = sqrt(n);
            }
        }
        if (n > 1) {
            nrDiv *= 2; 
            sum *= (n+1);
            sum %= mod;
        }
        fout << nrDiv << " " << sum << "\n";
    }
    
    fin.close();
    fout.close();
    
    return 0;
}