Cod sursa(job #2143288)

Utilizator PetyAlexandru Peticaru Pety Data 25 februarie 2018 19:39:03
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1000002;

bool v[NMAX];
int prime[NMAX];

int len, t, nrdiv, pos;
long long n, sumdiv, put;

void ciur(){
    for(int i = 4; i <= NMAX; i += 2)
        v[i] = 1;
    for(int i = 3; i * i <= NMAX; i += 2){
      if(v[i] == 0){
        for(int j = i * i; j <= NMAX; j += i * 2)
          v[j] = 1;
      }
    }
   prime[++len] = 2; prime[++len] = 3; int d = 5;
   while (d <= NMAX) {
      if (v[d] == 0)
        prime[++len] = d;
      if (v[d + 2] == 0)
        prime[++len] = d + 2;
      d += 6;
   }
}

int main()
{
    fin >> t;
    ciur();
    for(int i = 1; i <= t; i++){
        fin >> n;
        nrdiv = 1; pos = 1; int exp;
        sumdiv = 1;
        while(prime[pos] * prime[pos] <= n && pos <= len){
            put = 1; exp = 0;
            while(n % prime[pos] == 0){
                n /= prime[pos];
                put *= prime[pos];
                exp++;
            }
            put *= prime[pos];
            nrdiv *= (exp + 1);
            sumdiv *= (long long)((put - 1) / (prime[pos] - 1));
            pos++;
        }
        if(n > 1){
            nrdiv *= 2;
            sumdiv *= (long long)((n * n - 1) / (n - 1));
        }
        sumdiv %= 9973;
        fout << nrdiv << " " << sumdiv << "\n";
    }
    return 0;
}