Cod sursa(job #916314)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 16 martie 2013 12:27:59
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <algorithm>
#include <math.h>
#include <stdlib.h>
using namespace std;

const int dim = 1000030, mod = 9973;
long long N;
int T, NF, NR, SUM, ciur[dim];

ifstream fi ("ssnd.in");
ofstream fo ("ssnd.out");

inline int putere (int x, int p) {
    int rez = 1;
    x %= mod;
 
    for(; p; p >>= 1) {
        if(p & 1) {
            rez *= x;
            rez %= mod;
        }
 
        x *= x;
        x %= mod;
    }
 
    return rez;
}

void calc_ciur ()
{
	int i, j;
	for (i = 2; i < dim; i++)
	{
		if (ciur[i]) continue;
		ciur[++ciur[0]] = i;
		for (j = i << 1; j < dim; j += i)
			ciur[j] = 1;
	}
}

void calc_nr_divizori (int n)
{
	NR *= (n + 1);
}

void calc_suma_divizori (int p, int n)
{
	int a = putere (p, n + 1) - 1;
	if (a < 0) a += mod; 
	int b = putere (p - 1, mod - 2);
	
	SUM = SUM * a % mod * b % mod;
}


void calc_factori_primi ()
{
	int i, n;
	long long x = N, d;
	NF = -1;
	
	for (i = 1; 1LL * ciur[i] * ciur[i] <= N; i++)
	{
		if (x % ciur[i]) continue;
		d = ciur[i];
		
		for (n = 0; x % d == 0; x /= d, n++);
		
		calc_nr_divizori (n);
		calc_suma_divizori (d % mod, n);
	}
	if (x != 1)
	{
		calc_nr_divizori (1);
		calc_suma_divizori (x % mod, 1);
	}
}

int main ()
{
	calc_ciur ();
	
	fi >> T;
	while (T --)
	{
		fi >> N;
		NR = SUM = 1;
		
		calc_factori_primi ();
		
		fo << NR << ' ' << SUM << '\n';
	}
	
	return 0;
}