Cod sursa(job #1025945)

Utilizator danny794Dan Danaila danny794 Data 10 noiembrie 2013 20:18:04
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 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, totalSum = 1, div;
  int pow, totalDiv = 1;

  for (int i = 0; (1LL * primes[i] * primes[i] <= N) && (i < size); i++){
	  if (k % primes[i] == 0) continue;

	  pow = 0;
	  div = 1;
	  while (k % primes[i] == 0){
		  pow++;
		  k /= primes[i];
		  div*= primes[i];
	  }
	  totalSum*=(div * primes[i] - 1) / (primes[i] - 1) % MOD;
	  totalDiv*=(1 + pow);
  }

  if (k > 1){
	  totalSum*=(1+k) % MOD;
	  totalDiv*=2;
  }

  result.first = totalSum % MOD;
  result.second = totalDiv;
  return result;
}

void solve(long long N){
	pair<long long, int> p = getPrimeDecomposition(N);
	g << p.second << " " << p.first << "\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;
}