Cod sursa(job #916317)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 16 martie 2013 12:32:19
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <bitset>
using namespace std;

const int dim = 1000030, mod = 9973;
long long N;
int T, NF, NR, SUM, ciur[dim/10];
bitset <dim> viz;

ifstream fi ("ssnd.in");
ofstream fo ("ssnd.out");

int putere (int baza, int exp)
{
	int x = 1, b;
	for (b = 16; b >= 0; b--)
	{
		x = (x * x) % mod;
		if ((exp >> b) & 1)
			x = (x * baza) % mod;
	}
	return x;
}

void calc_ciur ()
{
	int i, j;
	for (i = 2; i < dim; i++)
	{
		if (viz[i]) continue;
		ciur[++ciur[0]] = i;
		for (j = i << 1; j < dim; j += i)
			viz[j] = 1;
	}
}

void calc_nr_divizori (int n)
{
	NR *= (n + 1);
}

void calc_suma_divizori (int p, int n)
{
	int a = putere (p, n + 1) - 1;
	if (a < 0) a += mod; 
	int b = putere (p - 1, mod - 2);
	
	SUM = SUM * a % mod * b % mod;
}


void calc_factori_primi ()
{
	int i, n;
	long long x = N, d;
	NF = -1;
	
	for (i = 1; 1LL * ciur[i] * ciur[i] <= N; i++)
	{
		if (x % ciur[i]) continue;
		d = ciur[i];
		
		for (n = 0; x % d == 0; x /= d, n++);
		
		calc_nr_divizori (n);
		calc_suma_divizori (d % mod, n);
	}
	if (x != 1)
	{
		calc_nr_divizori (1);
		calc_suma_divizori (x % mod, 1);
	}
}

int main ()
{
	calc_ciur ();
	
	fi >> T;
	while (T --)
	{
		fi >> N;
		NR = SUM = 1;
		
		calc_factori_primi ();
		
		fo << NR << ' ' << SUM << '\n';
	}
	
	return 0;
}