Cod sursa(job #791459)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 24 septembrie 2012 11:53:14
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<fstream>

#define MAX 1048576
#define REST 9973

using namespace std;

bool c[MAX];
int prm[MAX];
long long n, a;

void ciur()
{
	prm[++prm[0]] = 2;
	for(int i = 3; i < MAX; i += 2)
	{
		if(!c[i])
		{
			prm[++prm[0]] = i;
			for(int j = 2; j * i < MAX; j++)
				c[i * j] = true;
		}
	}
}

int lgput(int val, int put)
{
	int x = 1; val %= REST;
	while(put)
	{
		if(put & 1)
			x = (x * val) % REST;
		val = (val * val) % REST;
		put >>= 1;
	}
	return x;
}

int main()
{
	ciur();
	ifstream in("ssnd.in"); ofstream out("ssnd.out");
	in>>n;
	while(n--)
	{
		in>>a;
		int sum = 1, nr = 1, p1, p2;
		for(int i = 1; prm[i] * prm[i] <= a; i++)
		{
			if(a % prm[i]) continue;
			int put = 0;
			while(!(a % prm[i]))
			{
				a /= prm[i];
				put++;
			}
			nr *= put + 1;
			p1 = (lgput(prm[i], put + 1) - 1) % REST;
			p2 = (lgput(prm[i] - 1, REST - 2)) % REST;
			sum = (((sum * p1) % REST) * p2) % REST;
		}
		if(a > 1)
		{
			nr *= 2;
			sum = (1LL * sum * (a + 1) % REST);
		}
		out<<nr<<" "<<sum<<"\n";
	}
	in.close(); out.close();
}