Cod sursa(job #1194262)

Utilizator G_DavidGherghita David G_David Data 3 iunie 2014 12:02:25
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>

using namespace std;

const int CONST = 9973, ZECE = 1000001;
bool v[ZECE];
long long v2[ZECE];

long long pow(long long x, long long y)
{
	long long p;
	if (y == 1)
		return x;
	p = pow(x, y/2);
	if (y % 2 == 0)
			return p * p;
	else 
		return p * p * x;
}

int main()
{
	long long t, n, s, card, div, c, i, k = 0, j;
	
	ifstream infile ("ssnd.in");
	ofstream outfile ("ssnd.out");
	
	infile >> t;
	
	for (i = 2; i < ZECE; i++)
		v[i] = 1;
	for (i = 2; i < ZECE; i++)
	{
		if (v[i] == 1)
		{
			v2[k] = i;
			k++;
			for (j = i * 2; j < ZECE; j += i)
				v[j] = 0;
		}
	}
	
	for (i = 0; i < t; i++)
	{
		infile >> n;
		s = 1;
		card = 1;
		
		for (j = 0; v2[j] * v2[j] <= n; j++)
		{	
			div = v2[j];
			
			c = 0;
			while (n % div == 0)
				{
					n /= div;
					c++;	
				}
			if (c > 0)
				{	
					s *= (((pow(div, c + 1) - 1) / (div - 1)) % CONST);
					s %= CONST;
					card *= (c + 1);	
				}
			
		}
		
		if (n > 1)
		{
			s *= (((pow(n, 2) - 1) / (n - 1)) % CONST);
			s %= CONST;
			card *= 2;
		}
		outfile << card << " " << s << "\n";
	}	
	
	
	outfile.close();
}