Cod sursa(job #1598934)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 13 februarie 2016 14:40:46
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

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

const int MOD = 9973;
const int MAXVAL = 1000000;

int n;

vector<int> v;
bool check[MAXVAL];

int put(int x, int a) {

	//X ^ a
	int v[32];
	int res = 1;

	v[1] = x % MOD;

	for(int i = 2; i <= 31; ++i)
		v[i] = (1ll * v[i - 1] * v[i - 1]) % MOD;

	for(int i = 0 ; i <= a; ++i)
		if(a & (1 << i))
			res = (1ll * res * v[i + 1]) % MOD;

	return res;
}

void eratostene() {

	/* O(n * logn) */

	for(int i = 2; i <= MAXVAL; ++i)
		if(check[i] == 0) {

			v.push_back(i);
			for(int j = i + i; j <= MAXVAL; j += i)
				check[j] = 1;
		}
}

void find(long long x) {

	int sumdiv = 1;
	int nrdiv = 1;

	for(unsigned i = 0 ; i < v.size(); ++i) {

		int d = v[i];

		if(1ll * d * d > x) break;
		if(x % d) continue;

		int nrd = 0;
		int sirSum = 1;
		int divPow = 1;

		while(x % d == 0) {

			divPow = (1ll * divPow * d) % MOD;
			sirSum = (1ll * sirSum + divPow) % MOD;

			x /= d;
			nrd++;
		}

		nrdiv = (1ll * nrdiv * (nrd + 1)) % MOD;
		sumdiv = (1ll * sumdiv * sirSum) % MOD;
	}

	if(x > 1) {
		/*
		 * poate sa ramana maxim un divizor neluat in calcul
		 * si anume cel mai mare, ca un divizor sa nu fie luat in calcul trebuie ca
		 * el sa fie mai mare decat produsul tutoro celoralati divizori(d^2 > x)
		 * nu poate fi adevarat decat pentru cel mai mare divizor prim
		 */
		nrdiv = (1ll * nrdiv * 2) % MOD;
		sumdiv = (1ll * sumdiv * (1 + x)) % MOD;
	}

	fout << nrdiv << " " << sumdiv << '\n';
}

int main() {

	fin >> n;

	eratostene();

	while(n--) {

		long long x;
		fin >> x;
		find(x);
	}

	return 0;
}