Cod sursa(job #2738351)

Utilizator FrostfireMagirescu Tudor Frostfire Data 5 aprilie 2021 18:43:09
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>
#include <cmath>
#define MOD 9973
#define f first
#define s second
#define ll long long
#define DIM 1000000
 
using namespace std;
 
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
 
int t;
bitset <DIM+10> ciur;
vector <ll> prime;
 
void precalc()
{	for(int i=2; i<=DIM; i++)
		if(!ciur[i])
			{	prime.push_back(i);
				for(int j=2*i; j<=DIM; j+=i)
					ciur[j] = 1;
			}
}
 
ll lgput(ll a, ll n)
{	if(!n) return 1;
	if(n % 2 == 0) return lgput(a*a % MOD, n/2);
	return a * lgput(a*a % MOD, n/2) % MOD;
}
 
int main()
{
	precalc();
	fin >> t;
	while(t--)
		{	ll n, ans1 = 1, ans2 = 1, val1 = 1, val2 = 1;
			fin >> n;
			for(int i=0; i<prime.size(); i++)
				{	if(prime[i] * prime[i] > n) break;
					if(n % prime[i] == 0)
						{	ll val = prime[i], cnt = 0;
							while(n % prime[i] == 0)
								{	cnt++;
									n /= prime[i];	
								}
							ans1 = ans1 * (cnt + 1) % MOD;
							val1 = (lgput(val, cnt + 1) - 1 + MOD) % MOD;
							val2 = lgput(val - 1, MOD - 2);
							ans2 = ans2 * val1 * val2 % MOD;
						}
				}
			if(n > 1)
				{	ans1 = ans1 * 2 % MOD;
					val1 = (lgput(n, 2) - 1 + MOD) % MOD;
					val2 = lgput(n - 1, MOD - 2);
					ans2 = ans2 * val1 * val2 % MOD;
				}
			fout << ans1 << ' ' << ans2 << '\n';
		}
	return 0;
}