Cod sursa(job #2352585)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 23 februarie 2019 14:11:07
Problema Suma si numarul divizorilor Scor 70
Compilator cpp-32 Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std;

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

const int bound = 1e6;
const int mod = 9973;

vector <int> divs;

bitset <bound + 3> vis;

void ciur()
{
	divs.push_back(2);
	
	for(int i = 3; i < bound; i += 2)
		if(vis[i] == 0)
		{
			divs.push_back(i);
			
			if(1LL * i * i < bound)
			for(int j = i * i; j < bound; j += 2 * i)
				vis[j] = 1;
		}
}

int lgpow(int a, int b)
{
	int sol = 1;
	a %= mod;
	
	while(b)
	{
		if(b % 2 == 1)
			sol = (sol * a) % mod;
		
		b /= 2;
		a = (a * a) % mod;
	}
	
	return sol;
}

void solve()
{
	long long n;
	in >> n;
	
	int number = 1;
	int sum = 1;
	
	long long m = n;
	
	for(auto i : divs)
	{
		if(i * i > m)
			break;
		
		if(n % i != 0)
			continue;
		
		int nr = 0;
		
		while(n % i == 0)
		{
			n /= i;
			nr++;
		}
		
		number *= (nr + 1);
		
		int up = (lgpow(i, nr + 1) - 1);
		
		if(up < 0)
			up += mod;
		
		int inv = (lgpow(i - 1, mod - 2));
		
		sum = (((sum * up) % mod) * inv) % mod;
	}
	
	if(n > 1)
	{
		number *= 2;
		sum = (sum * (n + 1)) % mod;
	}
	
	out << number << ' ' << sum << '\n';
}


main()
{
	ciur();
	
	int t;
	in >> t;
	
	while(t--)
		solve();
}