Cod sursa(job #1214074)

Utilizator andreas.chelsauAndreas Chelsau andreas.chelsau Data 29 iulie 2014 16:22:28
Problema Suma si numarul divizorilor Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
typedef long long ll;
const ll mod = 9973;
ll a[1000005],prime[1000005],k;

void ciur(ll n){
	for(ll i = 2; i <= n; i++){
		if((a[i] & 1) == 0)
			prime[k++] = i;
		for(ll j = i * i; j <= n; j += i){
			a[j] = 1;
		}
	}
}
inline ll pow_mod(ll a, ll b){
	ll res = 1;
	while(b){
		if(b & 1)
			res = (res * a) % mod;
		a = (a * a) % mod;
		b >>= 1;
	}
	return res;
}
inline ll inverse_mod(ll a){
	ll x0 = 1,y0 = 0,x1 = 0,y1 = 1;
	ll b = (ll) mod;
	while(b){
		ll r = a % b;
		ll 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){
	ll divNo = 1,divSum = 1;
	for(ll i = 0; i < k; i++){
		if(prime[i] * prime[i] > n)
			break;
		ll exp =  1;
		while(n % prime[i] == 0){
			exp++;
			n /= prime[i];
		}
		if(exp > 1){
			divNo = (divNo * exp) % mod;
			divSum = (divSum * (pow_mod(prime[i],exp) - 1) * inverse_mod(prime[i] - 1)) % mod;
		}
	}
	if(n > 1){
		divNo <<= 1;
		divSum = (divSum * (n + 1)) % mod;
	}
	printf("%lld %lld\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;
}