Cod sursa(job #478640)

Utilizator a.stanciuStanciu Adrian a.stanciu Data 19 august 2010 15:56:02
Problema Suma si numarul divizorilor Scor 70
Compilator c Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>
#include <stdlib.h>

#define N 1000000

int ciur(char *v, int *w)
{
	int i, j, nw = 0;
	for (i = 2; i <= N; i++)
		if (v[i] == 0)
		{
			w[nw++] = i;
			for (j = 2 * i; j < N; j = j + i) v[j] = 1;
		}
	return nw;
}

void desc(long long n, int *w, int nw, FILE *g)
{
	int i = 0;
	long long s = 1, p, nr = 1, d, sm;
	
	while (n > 1)
	{
		d = 0; p = 1;
		
		while (n % w[i] == 0)
		{
			d++;
			p *= w[i];
			n /= w[i];
		}
		
		nr *= (d + 1);
		
		p *= w[i]; 
		sm = ((p - 1) / (w[i] - 1)) % 9973;
		s = (s * sm) % 9973;
		
		i++;
	}
	
	fprintf(g, "%lld %lld\n", nr, s);
}

int main()
{
	int t, i;
	long long n;
	FILE *f, *g;

	f = fopen("ssnd.in", "r");
	g = fopen("ssnd.out", "w");

	char *v = (char *)calloc(N, sizeof(char));
	int *w = (int *)malloc(sizeof(int) * (N / 10));
	int nw = ciur(v, w);

	fscanf(f, "%d", &t);
	for (i = 0; i < t; i++)
	{
		fscanf(f, "%lld", &n);
		desc(n, w, nw, g);
	}
	fclose(f);
	fclose(g);

	return 0;
}