Cod sursa(job #643066)

Utilizator alexandrapAlexandra Podiuc alexandrap Data 2 decembrie 2011 20:33:28
Problema Suma si numarul divizorilor Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.69 kb
#include<stdio.h>
#include<unistd.h>
#include<math.h>
#include<string.h>
#define M 1000000
#define q 9973
char vect[M];
int P[M];
int cP=0;
void eratostene() {
	int cur_pos = 2;
	int i;
	int k=0;
	while( cur_pos <= M) {
		P[k++]=cur_pos;
		for( i = cur_pos*2; i<= M; i+=cur_pos){
			vect[i] = 0;
		}
		cur_pos++;
		while(vect[cur_pos] == 0 && cur_pos <= M) {
			cur_pos++;
		}
	}
	cP=k;
}

void sol(long long num, FILE* file){
	long long i;
	long long count, sum;
	long long  max_pow_c;// return the max pow from the prime num decomposition
	long long  max_pow_r;//ret the mux num from the prime num decomposition
	count = 1;
	sum = 1 ;
	long long num_stop;
	num_stop=num;

	for(i = 0; i <= cP && ((long long )P[i]*P[i]) <= num_stop; i++) {
		if (num % P[i] == 0){
			max_pow_c = 1;
			max_pow_r = (long long ) P[i];
			while(num % P[i] == 0) {
				max_pow_c++;
				max_pow_r = (max_pow_r*(long long )P[i]);
				num /= P[i];
			}
			// printf("num %lld i %lld\n", num, (long long ) P[i]);	
			count*=max_pow_c;
			sum = (sum * (((max_pow_r - 1)/((long long )P[i] - 1))%q))%q;
			
		}
	}
	//prime numbers
	if(num > 1) {
		count*=2;
		sum = (sum*((num+1)%q))%q;
		num/=num;
	}
	//write the count and sum to file
	fprintf(file, "%lld %lld\n", count, sum);	
}

int main(){
	int t;
	long long num, i;
	FILE* fin = fopen("ssnd.in", "r");
	FILE* fout = fopen("ssnd.out", "w");
	memset(vect, 1, M*sizeof(char));
	eratostene();
	printf("eratostene reslt\n");
	for(i = 0; i < 13; i++) {
		printf(" %d", (int) vect[i]);
	}
	printf("\n");	
	fscanf(fin, "%d\n", &t);
	for(i = 0; i < t; i++){
		fscanf(fin, "%lld\n", &num);
		// printf("A citit %lld si cauta solutia\n", num);
		sol(num, fout);
	}
	fclose(fin);
	fclose(fout);
	return 0;
}