Cod sursa(job #2255758)

Utilizator flibiaVisanu Cristian flibia Data 7 octombrie 2018 15:51:33
Problema Suma si numarul divizorilor Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <bits/stdc++.h>
#define ll long long
#define N 1000000
#define mod 9973

using namespace std;

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

int t;
ll n;
bitset <N + 123> viz;
vector <int> primes;

ll lg(ll a, ll n){
	ll rs = 1;
	while(n){
		if(n & 1LL)
			rs = (rs * a) % mod;
		a = (a * a) % mod;
		n >>= 1LL;
	}
	return rs;
}

void solve(ll x){
	ll unu = 1, doi = 1;
	for(auto i : primes){
		if(1LL * i * i > x)
			break;
		if(x % i)
			continue;
		ll cnt = 0;
		while(x % i == 0){
			cnt++;
			x /= i;
		}
	//	cout << i << ' ' << cnt << endl;
		unu = (unu * (cnt + 1)) % mod;
		doi = (doi * (lg(i, cnt + 1) - 1)) % mod;	
		doi = (doi * lg(i - 1, mod - 2)) % mod;
	}
	if(x > 1){
		unu = (2LL * unu) % mod;
		doi = (doi * (x + 1)) % mod;
	}
	out << unu << ' ' << doi << '\n';
}

int main(){
	in >> t;
	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;
		}
	while(t--){
		in >> n;
		solve(n);
	}
	return 0; 
}