Cod sursa(job #2352593)

Utilizator mihai50000Mihai-Cristian Popescu mihai50000 Data 23 februarie 2019 14:15:13
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.16 kb
#include <bits/stdc++.h>

using namespace std;

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

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

bitset <bound + 3> vis;

int k = 0;

int divs[bound];

void ciur()
{
	divs[++k] = 2;
	
	for(int i = 3; i < bound; i += 2)
		if(vis[i] == 0)
		{
			divs[++k] = 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;
	
	for(int i = 1; i <= k && 1LL * divs[i] * divs[i] <= n; i++)
	{
		if(n % divs[i] != 0)
			continue;
		
		int nr = 0;
		
		while(n % divs[i] == 0)
		{
			n /= divs[i];
			nr++;
		}
		
		number *= (nr + 1);
		
		int up = (lgpow(divs[i], nr + 1) - 1);
		
		if(up < 0)
			up += mod;
		
		int inv = (lgpow(divs[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();
}