Cod sursa(job #1139669)

Utilizator andreiagAndrei Galusca andreiag Data 11 martie 2014 13:09:14
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;
typedef long long ll;

const int MOD = 9973;
const int Nmax = 1000000;
const int Rng = 1000000;

char isPrime[Nmax];
int T, prime[Rng];
ll N;


int main()
{
    ifstream f ("ssnd.in");
    ofstream g ("ssnd.out");

// generarea numerelor prime
    memset(isPrime, 1, sizeof(isPrime));
    isPrime[0] = isPrime[1] = 0;
    prime[0] = 1;
    int p = 1;
    for (int i = 2; i < Nmax; i++) {
        if (isPrime[i]) {
            prime[p++] = i;
            for (ll j = 1ll*i*i; j < Nmax; j += i)
                isPrime[j] = 0;
        }
    }

    //int primelimit = p;

// program

    f >> T;
    for (int t = 0; t < T; t++) {
        f >> N;
        ll numdiv = 1,
           sumdiv = 1;

        int i = 1, p = prime[i];
        while (1ll*p*p <= N) {
            if (N % p == 0) {
                int e = 0;
                ll factor = p;
                while (N % p == 0) {
                    e++;
                    factor *= p;
                    N /= p;
                }
                sumdiv *= (factor - 1) / (p - 1);
                numdiv *= e + 1;
            }
            p = prime[++i];
        }
        if (N > 1) {
            numdiv *= 2;
            sumdiv *= N + 1;
        }
        g << numdiv % MOD << ' ' << sumdiv % MOD << '\n';
    }

    return 0;
}