Cod sursa(job #2098318)

Utilizator flibiaVisanu Cristian flibia Data 2 ianuarie 2018 17:38:42
Problema Suma si numarul divizorilor Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 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;
ll x, sum, nr, cnt;
vector <ll> primes;
bool viz[1000100];

void add(ll &n, ll val){
	n = (n + val) % mod;	
}

void mul(ll &n, ll val){
	n = (n * val) % 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;
		}	
}

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

void gcd(ll a, ll b, ll &d, ll &x, ll &y){
	if(!b){
		d = a;
		x = 1;
		y = 0;
	} else{
		ll xx, yy;
		gcd(b, a % b, d, xx, yy);
		x = yy;
		y = xx - yy * (a / b);
	}
}

ll invers(int a){
	ll b = mod, d, x, y;
	gcd(a, b, d, x, y);
	while(x < 0)
		x += mod;
	return x % mod;
}

void solve(){
	in >> x;
	sum = nr = 1;
	ll xx = x;
	vector <pair <ll, ll> > v;
	for(auto i : primes){
		if(i > x)
			break;
		cnt = 0;
		while(x % i == 0 || x == i)
			cnt++, x /= i;
		if(cnt) 
			v.push_back({i, cnt});
	}
	if(v.size() == 0 || (x >= N))
		v.push_back({xx, 1});
	for(auto i : v){
		mul(nr, i.second + 1);
		mul(sum, lgput(i.first, i.second + 1) - 1);
		mul(sum, invers(i.first - 1));
	}
	out << nr << ' ' << sum << '\n';
}

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