Cod sursa(job #2869814)

Utilizator DooMeDCristian Alexutan DooMeD Data 11 martie 2022 20:54:20
Problema Suma si numarul divizorilor Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int modulo = 9973;
const int nmax = 1e6;

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

bool c[nmax+5];
int prime[nmax+5];
int nr;
void sieve() {
	for(int i=3; i*i<=nmax; i+=2)
		if(!c[i])
			for(int j=i*i; j<=nmax; j+=i)
				c[j] = true;
	prime[++nr] = 2;
	for(int i=3; i<=nmax; i+=2) if(!c[i]) prime[++nr] = i;
}

ll lgput(ll base, ll exp) {
	ll temp = 1;
	while(exp) {
		if(exp%2) temp = temp * base % modulo;
		base = base * base % modulo;
		exp /= 2;
	}
	return temp;
}

int fc[nmax+5];
int e[nmax+5];
void solveFor(ll x) {
	int nrf = 0;
	int k = 1;
	while(prime[k] * prime[k] <= x and k<=nr) {
		if(x % prime[k] == 0) {
			fc[++nrf] = prime[k];
			e[nrf] = 0;
			while(x % prime[k] == 0) {
				e[nrf] ++;
				x /= prime[k];
			}
		}
		k++;
	}
	if(x!=1) {
		fc[++nrf] = x;
		e[nrf] = 1;
	}
	ll prod = 1;
	ll sum = 1;
	for(int i=1; i<=nrf; i++) {
		prod = prod * 1LL * (e[i] + 1);
		ll top = lgput(fc[i], e[i]+1) - 1;
		if(top<0) top = top + modulo;
		ll bot = lgput(fc[i]-1, modulo-2);
		sum = (sum * 1LL * ((top * bot) % modulo)) % modulo;
	}
	g << prod << " " << sum << "\n";
}

int main() {
	sieve();
	int t; f >> t;
	for(int cas=1; cas<=t; cas++) {
		ll x; f >> x;
		solveFor(x);
	}
	return 0;
}