Cod sursa(job #2098341)

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

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

void mul(int &n, int 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;
		}	
}

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;
	sum1 = sum2 = nr = 1;
	int n = 0;
	for(auto i : primes){
		if(i * i > x)
			break;
		cnt = 0;
		while(x % i == 0 || x == i)
			cnt++, x /= i;
		if(cnt){
			n++;
			mul(nr, cnt + 1);
			mul(sum1, lgput(i, cnt + 1) - 1);
			mul(sum2, i - 1);
		}
	}
	if(x > 1){
		mul(nr, 2);
		mul(sum1, lgput(x, 2) - 1);
		mul(sum2, x - 1);
	}
	mul(sum1, lgput(sum2, mod - 2));
	out << nr << ' ' << sum1 << '\n';
}

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