Cod sursa(job #1231347)

Utilizator daniel.amarieiDaniel Amariei daniel.amariei Data 20 septembrie 2014 12:53:57
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <fstream>
#include <cmath>
#define M 9973
using namespace std;

int factors(long long & n, long long p) 
{
	int d = 0;
	while (n > 1 && ((n % p) == 0))
	{
		++d;
		n /= p;
	}
	
	return d;
}

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

int main()
{
	ifstream ifs("ssnd.in");
	ofstream ofs("ssnd.out");
	int t;
	
	ifs >> t;
	
	for (int i = 0; i < t; ++i) 
	{
		long long n;
		ifs >> n;

		long long sqrt_n = sqrt(n);
		
		long long card = 1;
		long long sum = 1;
	
		for (long long p = 2; p <= sqrt_n; ++p) 
		{
			long long d = factors(n, p);
				
			if (d > 0)
			{
				// Update the number of divisors
				card *= (d + 1);
					
				// Update the sum
				long long f = ( (pow(p, d + 1) - 1) / (p - 1) ) % M;
				sum = sum * f % M; 
			}
		}
		
		if (n > 1) 
		{
			long long d = 1;
		
			// Update the number of divisors
			card *= (d + 1);
			
			// Update the sum
			long long f = ( (pow(n, d + 1) - 1) / (n - 1) ) % M;
			sum = sum * f % M; 
		}
		
		ofs << card << " " << sum << "\n";
	}
	
	return 0;
}