Cod sursa(job #2103285)

Utilizator dragos.galeteanu2001Dragos Iulian dragos.galeteanu2001 Data 9 ianuarie 2018 23:42:54
Problema Suma si numarul divizorilor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#define MOD 9973
#define limit 1000005

using namespace std;

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

long long int n, k = 0, DA[limit];
int t;
bool prim[limit];

void ciur()
{
	long int i, j;
	DA[k++] = 2;
	for (i = 1; ((i * i) << 1) + (i << 1) <= limit; i++) {
		if (prim[i] == 0) {
			DA[k++] = 2 * i + 1;
			for (j = ((i * i) << 1) + (i << 1); (j << 1) + 1 <= limit; j += (i << 1) + 1)
				prim[j] = 1;
		}
	}
	k--;
}

long long int power(long long int x, long long int p)
{
	long long int rez = 1;
	while (p) {
		if (p & 1) rez = (rez*x) % MOD;
		x = (x*x) % MOD;
		p >>= 1;
	}
	return rez % MOD;
}

void solve()
{
	f >> n;
	long long int nr = 1, sum = 1, pw, i, pw1, pw2;
	for (i = 0; i <= k && DA[i] * DA[i] <= n; i++) {
		if (n % DA[i]) continue;
		pw = 0;
		while (n % DA[i] == 0) {
			n /= DA[i];
			pw++;
		}
		nr *= (pw + 1);
		pw1 = (power(DA[i], pw + 1) - 1) % MOD;
		pw2 = (power(DA[i] - 1, MOD-2)) % MOD;
		sum = (((sum*pw1) % MOD) * pw2 ) % MOD;
	}

	if (n > 1) {
		nr *= 2;
		sum = (sum * (n + 1)) % MOD;
	}

	g << nr << ' ' << sum << '\n';
}

int main()
{
	ciur();
	f >> t;
	while (t) {
		solve();
		t--;
	}
	f.close();
	g.close();
    return 0;
}