Cod sursa(job #1025908)

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

using namespace std;

const int NMAX = 1000001;

int prime[NMAX], size;

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

void primes(){
	size = 1;
	prime[1] = 2;
	bool ok;
	for (int i = 3; i <= 1000000; i+=2){
		ok = true;
		for (int j = 1; prime[j] <= sqrt(i); j++)
			if (i % prime[j] == 0){
				ok = false;
				break;
			}

		if (ok) {
			prime[++size] = i;
		}
	}
}

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

  for (int i = 1; prime[i] <= sqrt(N) && i < size; i++){
	  pow = 0;
	  sum = 1;
	  div = 1;
	  while (k % prime[i] == 0){
		  pow++;
		  k /= prime[i];
		  div*= prime[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() {
	primes();
	int t;
	long long N;
	f >> t;
	for (int i = 1; i <= t; i++){
		f >> N;
		solve(N);
	}
	f.close();
	g.close();
	return 0;
}