Cod sursa(job #2352577)

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

using namespace std;

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

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

#define int long long

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);
			
			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()
{
	int n;
	in >> n;
	
	int number = 1;
	int sum = 1;
	
	int 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) % mod;
		int inv = (lgpow(i - 1, mod - 2)) % mod;
		
		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();
}