Cod sursa(job #1025922)

Utilizator danny794Dan Danaila danny794 Data 10 noiembrie 2013 20:00:19
Problema Suma si numarul divizorilor Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <iostream>
#include <cmath>

using namespace std;

const int NMAX = 1000001;

int prime[NMAX], size, primes[NMAX];

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

void getPrimes(){
	for (int i = 2; i < NMAX; i++)
		if (prime[i] == 0){
			primes[size++] = i;
			for (int j = 2 * i ; j < NMAX; j+=i){
				prime[j] = 1;
			}
		}

}

pair<long long, int> getPrimeDecomposition(long long N){
  pair<long long, int> result;
  long long k = N, sum, totalSum = 1;
  int pow, div, totalDiv = 1;

  for (int i = 0; (primes[i] * primes[i] < N) && (i < size); i++){
	  pow = 0;
	  sum = 1;
	  div = 1;
	  while (k % primes[i] == 0){
		  pow++;
		  k /= primes[i];
		  div*= primes[i];
		  sum+= div;
	  }
	  totalSum*=sum;
	  totalDiv*=(1+pow);
  }

  if (k > 1){
	  totalSum*=(1+k);
	  totalDiv*=2;
  }
  result.first = totalSum;
  result.second = totalDiv;
  return result;
}

void solve(long long N){
	pair<long long, int> p = getPrimeDecomposition(N);
	g << p.second << " " << p.first % 9973 << "\n";
}

int main() {
	getPrimes();
	int t;
	long long N;
	f >> t;
	for (int i = 1; i <= t; i++){
		f >> N;
		solve(N);
	}
	f.close();
	g.close();
	return 0;
}