Cod sursa(job #1214106)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 29 iulie 2014 17:19:11
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
typedef long long ll;
const int mod = 9973;
int a[1000005],prime[1000005],k;

void ciur(int n){
	for(int i = 2; i <= sqrt((double)n); i++){
		if(!a[i]){
			for(int j = i * i; j <= n; j += i){
				a[j] = 1;
			}
		}
	}
	for(int i = 2; i <= n; i++)
		if(!(a[i] & 1))
			prime[k++] = i;
}
inline int pow_mod(int a, int b){
	int res = 1;
	while(b){
		if(b & 1)
			res = (res * a) % mod;
		a = ((ll)a *(ll) a) % mod;
		b >>= 1;
	}
	return res;
}
inline int inverse_mod(int a){
	int x0 = 1,y0 = 0,x1 = 0,y1 = 1;
	int b = mod;
	while(b){
		int r = a % b;
		int x,y,q = a / b;
		a = b;
		b = r;
		x = x0 - q * x1;
		y = y0 - q * y1;
		x0 = x1; y0 = y1;
		x1 = x; y1 = y;
	}
	return (mod + x0) % mod;
}

void solve(ll n){
	int divNo = 1,divSum = 1;
	for(int i = 0; i < k; i++){
		if((ll)prime[i] * (ll)prime[i] > n)
			break;
		int exp =  1;
		while(n % (ll)prime[i] == 0){
			exp++;
			n /= (ll)prime[i];
		}
		if(exp > 1){
			divNo = (divNo * exp);
			divSum = (divSum * ((pow_mod(prime[i],exp) - 1) * inverse_mod(prime[i] - 1) % mod)) % mod;
		}
	}
	if(n > 1){
		divNo <<= 1;
		divSum = (divSum * (n + 1)) % mod;
	}
	printf("%d %d\n", divNo,divSum);
}

int main(){
	freopen("ssnd.in","r",stdin);
	freopen("ssnd.out","w",stdout); 
	ciur(1000000);
	int t;
	ll n;
	scanf("%d",&t);
	while(t--){
		scanf("%lld",&n);
		solve(n);
	}

	return 0;
}