Cod sursa(job #2159316)

Utilizator AndreiBadescuBadescu Andrei-Octavian AndreiBadescu Data 10 martie 2018 21:08:06
Problema Suma si numarul divizorilor Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

typedef unsigned long long ull;
using namespace std;

ifstream fin ("ssnd.in");
ofstream fout ("ssnd.out");

const ull maxCiur = 1000000, MOD = 9973;
bool v[1000001];
ull n, h, x, nr, s, p[78498];

inline void ciur ()
{
    ull i,j;

	v[0] = v[1] = 1;
	for ( i = 2; i < maxCiur; ++i )
		if ( !v[i] )
		{
			p[h++] = i;

			for ( j = i << 1; j <= maxCiur; j += i )
				v[j] = 1;
		}
}

inline ull logPow ( ull x, ull p )
{
	ull i, sol = 1;
	for ( i = 1; i <= p; i <<= 1 )
	{
		if ( i & p )
			sol *= x, sol %= MOD;

		x *= x, x %= MOD;
	}

	return sol;
}

inline void Div ( ull x, ull &nr, ull &s )
{
	ull i,t;

	nr = s = 1;

	for ( i = 0; x > 1 && p[i] * p[i] <= x; ++i )
	{
		t = 0;
		while ( x % p[i] == 0 )
			x /= p[i], ++t;

        nr *= t + 1;
        s *= (logPow( p[i], t + 1 ) - 1) / (p[i] - 1), s %= MOD;
	}

	if ( x > 1 )
	{
        nr <<= 1;
        s *= (x * x - 1) / (x - 1), s %= MOD;
	}
}

int main()
{
	ios::sync_with_stdio (false);
	ciur();

	ull i;

	//for ( i = 0; i < h; ++i )
    //    fout << p[i] << '\n';

	fin >> n;

	for ( i = 0; i < n; ++i )
	{
		fin >> x;

		Div (x, nr, s);

		fout << nr << " " << s << '\n';
	}
}