Cod sursa(job #1726732)

Utilizator elena.marinicaMarinica Elena-Georgiana elena.marinica Data 8 iulie 2016 19:46:21
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>

#define NMAX 1000004

long long primes[NMAX];
int prim[NMAX];
long long v[NMAX];

void ssnd(long long x, long long primes[], int k, long long &nr, long long &sum) {
	
	nr = 1;
	sum = 1;
	
	int po;
	
	long long s, p;
	
	for (int i = 0; i < k; i++) {
	
		po = 0;
		p = 1; s = 0;
		
		if (x < primes[i] * primes[i]) {
			continue;
		}
		
		while (x % primes[i] == 0) {
			po++;
			x = x / primes[i];
			s += p;
			p *= primes[i];
			
		}
		
		if (po != 0) {
			nr *= (po + 1);
			sum *= (s + p);
			sum = sum % 9973;
		}
	}
	
	if (x > 1) {
		nr *= 2;
		sum *= (1 + x);
		sum = sum % 9973;
	}
	
}

int main() {
	
	FILE *fin = fopen("ssnd.in", "r");
	FILE *fout = fopen("ssnd.out", "w");
	
	long long n, x, sum, nr;
	fscanf(fin, "%lld", &n);
	
	long long m = -1000000001;
	
	for (int i = 0; i < n; i++) {
		
		fscanf(fin, "%lld", &x);
		v[i] = x;
		
		if (x > m) {
			m = x;
		}
	}
	
	int k = 0;
	
	memset(prim, 1, sizeof(int) * NMAX);
	
	for (long long i = 2; i * i <= m; i++) {
		
		if (prim[i]) {
			primes[k] = i;
			k++;
		
			for (long long j = i + i; j * j <= m; j += i) {
			
				prim[j] = false;
				
			}
		}
	}

	for (int i = 0; i < n; i++) {
		ssnd(v[i], primes, k, nr, sum);
		fprintf(fout, "%lld %lld\n", nr, sum);
	}
}