Cod sursa(job #1349218)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 20 februarie 2015 01:10:36
Problema Suma si numarul divizorilor Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

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

const int maxn = 1000005;
const int mod = 9973;

vector <int> primes;
bitset <maxn> ciur;
int t, n;

inline void buildsieve() {
	for(int i = 2 ; i < maxn ; ++ i)
		if(!ciur[i]) {
			primes.push_back(i);
			for(int j = i + i ; j < maxn ; j += i)
				ciur[j] = 1;	
		}
}

inline int lgpow(int a, int b) {
	int ans = 1;
	a %= mod;
	for( ; b ; b >>= 1) {
		if(b & 1)
			ans = (ans * a) % mod;
		a = (a * a) % mod;
	}
	return ans;
}

inline int invmod(int x) {
	return lgpow(x, mod - 2);	
}

inline void getans(long long n) {
	int nr = 1, sum = 1;
	for(int i = 0 ; i < primes.size() && primes[i] * primes[i] <= n ; ++ i) {
		if(n % primes[i])
			continue;
		int exp = 0;
		while(n % primes[i] == 0) {
			++ exp;
			n /= primes[i];
		}
		nr = nr * (exp + 1);
		int first = (lgpow(primes[i], exp + 1) - 1 + mod) % mod;
		int second = invmod(primes[i] - 1);
		sum = (1LL * sum * first * second) % mod;
	}
	if(n > 1) {
		nr = nr * 2;
		int first = (lgpow(n, 2) - 1 + mod) % mod;
		int second = invmod(n - 1);
		sum = (1LL * sum * first * second) % mod;
	}
	fout << nr << ' ' << sum << '\n';
}

int main() {
	ifstream fin("ssnd.in");
	ofstream fout("ssnd.out");
	buildsieve();
	fin >> t;
	while(t --) {
		fin >> n;
		getans(n);
	}
}