Cod sursa(job #1472802)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 17 august 2015 19:44:03
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <fstream>
#define ll long long
#define N 1000000
#define MAX 80000
#define R 9973
using namespace std;

ifstream f("ssnd.in");
ofstream g("ssnd.out");

int n, i, j, nprim[MAX], div, d;
bool prim[N];
ll x, aux, nr, sum;

void ciur(){
	for(i = 2; i < N; i++)
		if(!prim[i]){
			nprim[++nprim[0]] = i;
			for(j = 2 * i; j < N; j += i)
				prim[j] = 1;
		}
}

int putlog(int x, int n){
	int rez = 1;
	x %= R;
	while(n > 0){
		if(n & 1)
			rez = rez * x % R;
		n >>= 1;
		x = x * x % R;
	}
	return rez;
}

void ssnd(ll x);

int main(){
	ciur();
	f >> n;
	for(i = 0; i < n; i++){
		f >> x;
		ssnd(x);
	}
	return 0;
}

void ssnd(ll x){
	int i = 1;
	nr = 1;
	sum = 1;
	aux = x;
	while((ll)nprim[i] * nprim[i] <= aux && i <= nprim[0]){
		if(x % nprim[i] == 0){
			div = nprim[i];
			d = 1;
			while(aux % div == 0){
				aux /= div;
				d++;
			}

			nr *= d;
	    sum = (sum * (putlog(div, d) - 1) % R) * putlog(div - 1, R - 2) % R;
		}
		i++;
	}

	if(aux != 1){
		nr *= 2;
		sum = sum * ((aux * aux - 1) / (aux - 1)) % R;
	}
	g << nr << " " << sum << "\n";
}