Cod sursa(job #2122387)

Utilizator ArctopusKacso Peter-Gabor Arctopus Data 4 februarie 2018 23:52:57
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <iostream>
#include <cmath>
#include <vector>
#include <fstream>
#include <unordered_map>

#define ll long long

using namespace std;

ifstream fcin("ssnd.in");
ofstream fcout("ssnd.out");

const ll NLIM = 1e12 + 10;
const int MOD = 9973;

int T;
ll N;

int nprim[1000000 + 10];
vector< int > primes;


void calcSiev()
{
	nprim[1] = 1;

	for( int i = 2; i <= 1000; ++i )
	{
		if( !nprim[i] )
		{
			for( int j = i * i; j < 1000000; j += i )
				nprim[j] = 1;
		}
	}

	for( int i = 1; i <= 1000000; ++i )
		if( !nprim[i] )
			primes.push_back( i );
}


int main()
{
	calcSiev();

	fcin >> T;
	while( T-- )
	{
		fcin >> N;
		int gy = sqrt( N );
		// int gy = N;

		
		int nr = 1;
		
		ll sum = 1;
		
		// unordered_map< ll, int > p;
		
		for( int i = 0; i < primes.size() && primes[i] <= gy; ++i )
		{
			
			int a = 0;
			ll pored = 1;
			ll hsum = 1;
			while( N % primes[i] == 0 )
			{
				a++;
				N /= primes[i];

				pored *= primes[i];
				hsum += pored;
				hsum %= MOD;
			} 
		    //cout << primes[i] << " " << a << "\n";
			
			nr *= a + 1;

			sum *= hsum;
			sum %= MOD;
		}

		if( nr == 1 )
		{
			nr = 2;
			sum = N + 1;
		}
		else if( N > 1 &&  N > gy )
		{
			nr *= 2;
			sum *= N + 1;
			sum %= MOD;
		}
		
		

		fcout << nr << " " << sum << "\n";
	}

}