Pagini recente » Cod sursa (job #1343100) | Cod sursa (job #1916799) | Cod sursa (job #2701494) | Cod sursa (job #1851789) | Cod sursa (job #2272823)
#include <iostream>
#include <fstream>
#define PRIMEMAX 1000010
using namespace std;
bool isNotPrime[PRIMEMAX];
int primeNr[PRIMEMAX], nrOfPrimes = 0, M = 9973;
void findPrimes()
{
for (int i=2; i<PRIMEMAX; i++)
{
if (isNotPrime[i] == 0)
{
for (int j=2; j*i<PRIMEMAX; j++)
isNotPrime[j*i] = 1;
primeNr[nrOfPrimes++] = i;
}
}
}
void findModInv(int a, int b, int &x, int &y)
{
if (!b)
{
x = 1;
y = 0;
}
else
{
findModInv(b, a%b, x, y);
int aux = y;
y = x - (a / b) * y;
x = aux;
}
}
int main()
{
findPrimes();
ifstream fin("ssnd.in");
ofstream fout("ssnd.out");
int t, nr, product, exp, divSum, divNr, ok, modInv, aux;
fin >> t;
for (int k=0; k<t; k++)
{
fin >> nr;
divNr = 1;
divSum = 1;
for (int i=0; i<nrOfPrimes && nr>1; i++)
{
product = 1;
exp = 0;
ok = 0;
while (nr%primeNr[i]==0)
{
ok = 1;
nr /= primeNr[i];
exp ++;
product *= primeNr[i];
}
if (ok)
{
divNr *= (exp+1);
product *= primeNr[i];
product --;
findModInv(primeNr[i]-1, M, modInv, aux);
if (modInv<0)
modInv += M;
divSum = ( (divSum % M) * ( ( (product % M) * (modInv % M) ) % M) ) % M;
}
}
fout << divNr << " " << divSum << "\n";
}
return 0;
}