Pagini recente » Cod sursa (job #3322737) | Cod sursa (job #3266288) | Cod sursa (job #3335681) | Cod sursa (job #2237336) | Cod sursa (job #3327626)
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("ssnd.in");
ofstream out("ssnd.out");
const long long VALMAX = 1e12;
const int SQRTMAX = 1e6;
const int PRIME_COUNT_MAX = 78500; //numarul de numere prime de la 1 la 1 milion
const long long MOD = 9973;
bool ciur[SQRTMAX + 1];
long long primes[PRIME_COUNT_MAX];
int k=0;
void calculeaza_ciur()
{
int i, j;
ciur[0]=1;
ciur[1]=1;
for(i=4; i<=SQRTMAX; i+=2)
{
ciur[i]=1;
}
for(i=3; i*i<=SQRTMAX; i+=2)
{
if(ciur[i]==0)
{
for(j=i*i; j<=SQRTMAX; j+=2*i)
{
ciur[j]=1;
}
}
}
}
void calculeaza_lista_prime()
{
int i;
k++;
primes[1] = 2;
for(i=3; i<=SQRTMAX; i += 2)
{
if(ciur[i] == 0)
{
k++;
primes[k] = i;
}
}
}
void descompunere(long long x, long long &sum_div, long long &nr_div)
{
//suma divizori: produs de (factor_i ^ (putere_i + 1) - 1) / (putere_i - 1)
//nr divizori: produs de (putere_i + 1)
int i, exponent=0;
long long p=1;
for(i=1; i<=k && x>1; i++)
{
if(x>1 && primes[i]*primes[i] > x)
{
//x ramas e prim
//factorul este: x ^ 1
nr_div *= 2;
sum_div *= (x*x-1)/(x-1);
sum_div %= MOD;
return;
}
if(x % primes[i] == 0)
{
p=1;
exponent = 0;
while(x % primes[i] == 0)
{
x /= primes[i];
p *= primes[i];
exponent++;
}
//factorul este: primes[i] ^ exponent
nr_div *= (exponent + 1);
sum_div *= (p*primes[i] - 1)/(primes[i] - 1);
sum_div %= MOD;
}
}
}
int main()
{
calculeaza_ciur();
calculeaza_lista_prime();
int t;
in>>t;
while(t--)
{
long long x, suma=1, nr=1;
in>>x;
descompunere(x, suma, nr);
out<<nr<<" "<<suma<<"\n";
}
return 0;
}