Cod sursa(job #2098352)

Utilizator flibiaVisanu Cristian flibia Data 2 ianuarie 2018 18:24:14
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <bits/stdc++.h>
#define mod 9973
#define ll long long
#define N 1000002

using namespace std;

ifstream in("ssnd.in");
ofstream out("ssnd.out");

int t, sum, nr, cnt;
ll x; 
vector <int> primes;
bool viz[1000100];

void mul(int &n, int val){
	n = (n * (val % mod)) % mod;
}

void precalc(){
	for(int i = 2; i <= N; i++)
		if(!viz[i]){
			primes.push_back(i);
			for(int j = i + i; j <= N; j += i)
				viz[j] = 1;
		}	
}

int lgput(int a, int p){
	a %= mod;
	int rs = 1;
	while(p){
		if(p & 1)
			mul(rs, a);
		mul(a, a);
		p /= 2;
	}
	return rs;
}

void solve(){
	in >> x;
	sum = nr = 1;
	for(auto i : primes){
		if(1LL * i * i > x)
			break;
		cnt = 0;
		while(x % i == 0)
			cnt++, x /= i;
		if(cnt){
			nr *= cnt + 1;
			mul(sum, lgput(i, cnt + 1) - 1);
			mul(sum, lgput(i - 1, mod - 2));
		}
	}
	if(x > 1){
		nr *= 2;
		mul(sum, (x + 1) % mod);
	}
	out << nr << ' ' << sum << '\n';
}

int main(){
	in >> t;
	precalc();
	while(t--)
		solve();
	return 0;
}