Cod sursa(job #2836918)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 21 ianuarie 2022 09:59:06
Problema Suma si numarul divizorilor Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <algorithm>
#include <fstream>
#include <queue>
#define MOD 9973
using namespace std;
 
ifstream cin( "ssnd.in" );
ofstream cout( "ssnd.out" );
 
int val[ 78500 ];
	
static inline long long mod( const long long& a ) {
	return ( a <= MOD ? a % MOD : a );
}
 
void eratostene(  ) {
	bool *ciur = new bool[ 500002 ]();
	{
		int I;
		for( int i = 3; i * i <= 1000000; i += 2 )
			if( !ciur[ i >> 1 ] ) {
				I = 2 * i;
				for( int j = i * i; j <= 1000000; j += I )
					ciur[ j >> 1 ] = 1;
			}
	}
 
	{
		val[ 0 ] = 2;
		int pp = 1;
		for( int i = 3; i <= 1000000; i += 2 )
			if( !ciur[ i >> 1 ] ) {
				val[ pp++ ] = i;
				//printf( "%d ", i );
			}
		//printf( "%d\n", pp );
	}
 
	delete[] ciur;
}
 
int main()
{
	int q;
	long long x;
 
	{eratostene();}
 
	cin >> q;
	while( q-- ) {
		cin >> x;
		int kk = 1;
		long long rez = 1;
		for( int i = 0; (long long)val[ i ] * val[ i ] <= x; i++ ) {
			int p = 0;
			long long b = val[ i ];
			while( x % val[ i ] == 0 ) {
				x /= val[ i ], p++;
				b *= val[ i ];
			}
 
			{
				--b;
				kk *= ( p + 1 );
				b /= ( val[ i ] - 1 );
				rez = mod( rez * mod( b ) );
			}
		}
 
		if( x > 1 ) {
			kk <<= 1;
			long long b = x * x;
			{
				--b;
				b /= ( x - 1 );
				rez = mod( rez * mod( b ) );
			}
		}
 
		cout << kk << ' ' << rez << '\n';
	}
 	return 0;
}