Cod sursa(job #1147564)

Utilizator SilverGSilver Gains SilverG Data 19 martie 2014 22:45:12
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
/*
    Keep It Simple!
*/

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

#include<stdio.h>
#define MOD 9973

int C[80000],nrd,T;
bool viz[1000003];

void Ciur()
{
	C[1] = 2;
	nrd++;
	for (int i = 3; i <= 1000003; i += 2)
	{
		if (viz[i]) continue;
		C[++nrd] = i;
		for (int j = i; j <= 1000003; j += i)
			viz[j] = 1;
	}
}

int lgpow(int a, int b)
{
	int sol = 1;
	while (b)
	{
		if (b % 2)
			sol = (1LL * sol*a) % MOD;
		a = (1LL * a*a) % MOD;
		b /= 2;
	}
	return sol;
}

int main()
{
	freopen("ssnd.in", "r", stdin);
	freopen("ssnd.out", "w", stdout);

	Ciur();

	scanf("%d", &T);

	while (T--)
	{
		long long Nr, NrDiv = 1, SumaDiv = 1;
		scanf("%lld",&Nr);

		for (int i = 1; i <= nrd && 1LL * C[i] * C[i] <= Nr; i++)
		if (Nr%C[i] == 0)
		{
			int cnt = 0;
			while (Nr%C[i] == 0) { cnt++; Nr /= C[i]; }
			NrDiv *= (cnt + 1);
			SumaDiv = (1LL*SumaDiv * (lgpow(C[i],cnt+1) - 1) * (lgpow(C[i]-1,MOD-2))) % MOD;
		}
		if (Nr > 1)
		{
			NrDiv *= 2;
			SumaDiv = (1LL * SumaDiv * (Nr+1)) % MOD;
		}

		printf("%d %d\n", NrDiv, SumaDiv);
	}

	return 0;
}