Cod sursa(job #1025929)

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

using namespace std;

const int NMAX = 1000001;

int prime[NMAX], size, primes[NMAX], MOD = 9973;

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++)
	  if (k % primes[i] ==0){
		  pow = 0;
		  sum = 1;
		  div = 1;
		  while (k % primes[i] == 0){
			  pow++;
			  k /= primes[i];
			  div*= primes[i];
			  sum+= div;
		  }
		  totalSum*=sum % MOD;
		  totalDiv*=(1+pow);
	  }

  if (k > 1){
	  totalSum*=(1+k) % MOD;
	  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 % MOD << "\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;
}