Pagini recente » Cod sursa (job #2668666) | Cod sursa (job #2923560) | Monitorul de evaluare | Cod sursa (job #1370473) | Cod sursa (job #3139188)
#include <fstream>
#include <bitset>
using namespace std;
ifstream cin ("ssnd.in");
ofstream cout ("ssnd.out");
int prime[80001];
bitset <500000> compus;
int NumarDivizori (long long numar)
{
int divizori = 1;
for (int indice = 1 ; indice <= prime[0] && 1LL * prime[indice] * prime[indice] <= numar ; indice++)
{
int exponent = 0;
while (numar % prime[indice] == 0) {
numar /= prime[indice];
exponent++;
}
divizori *= exponent + 1;
}
if (numar > 1)
divizori <<= 1;
return divizori;
}
int SumaDivizori (long long numar)
{
int suma = 1;
const int mod = 9973;
for (int indice = 1 ; indice <= prime[0] && 1LL * prime[indice] * prime[indice] <= numar ; indice++)
{
long long termen = prime[indice];
while (numar % prime[indice] == 0) {
numar /= prime[indice];
termen *= prime[indice];
}
(suma *= (termen - 1) / (prime[indice] - 1) % mod) %= mod;
}
if (numar > 1)
(suma *= (numar * numar - 1) / (numar - 1) % mod) %= mod;
return suma;
}
int main ()
{
prime[++prime[0]] = 2;
for (int valoare = 3 ; valoare < 1e6 ; valoare += 2)
if (!compus[(valoare - 1) >> 1])
{
prime[++prime[0]] = valoare;
for (long long multiplu = 1LL * valoare * valoare ; multiplu < 1e6 ; multiplu += (valoare << 1))
compus[(multiplu - 1) >> 1] = 1;
}
int lungime;
cin >> lungime;
long long numar;
for (int indice = 1 ; indice <= lungime ; indice++)
cin >> numar , cout << NumarDivizori(numar) << ' ' << SumaDivizori(numar) << '\n';
cout.close(); cin.close();
return 0;
}