Pagini recente » Numere Sprague-Grundy | Cod sursa (job #1324645) | Cod sursa (job #43846) | Cod sursa (job #223532) | Cod sursa (job #1466474)
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <algorithm>
#define limit 1000002
#define primes 78505
#define MOD 9973
using namespace std;
vector<long long> ciur;
char ok[1000002];
void getCiur()
{
for(int i = 2; i < limit; i++)
{
if(ok[i] == 0)
{
for(long long j = i + i; j < limit - 1; j += i)
{
ok[j] = 1;
}
ciur.push_back(i);
}
}
}
long long putere(long long x, long long p)
{
if(p == 0)
{
return 1;
}
else
{
if(p % 2 == 0)
{
return putere((x * x), p / 2);
}
return (putere(x, p - 1) * x);
}
}
int main()
{
freopen("ssnd.in", "r", stdin);
freopen("ssnd.out", "w", stdout);
int t;
scanf("%i", &t);
getCiur();
for(int k = 0; k < t; k++)
{
long long n;
scanf("%lld", &n);
long long special = n;
vector<long long> puteri;
puteri.clear();
for(int i = 0; i < primes; i++)
{
puteri.push_back(0);
}
int nr = 0;
bool ok = 1;
while(n > 1)
{
while(n % ciur[nr] == 0)
{
n /= ciur[nr];
puteri[nr]++;
ok = 0;
}
nr++;
if(nr == primes - 1)
{
break;
}
}
int nrDivizori = 1;
int sumaDivizori = 1;
if(ok == 1)
{
nrDivizori += 1;
sumaDivizori = special + 1;
}
else
{
for(int i = 0; i < primes; i++)
{
if(puteri[i] != 0)
{
int tmp1;
tmp1 = 1 + puteri[i];
nrDivizori *= tmp1;
int tmp2;
tmp2 = (putere(ciur[i], puteri[i] + 1) - 1) / (ciur[i] - 1);
sumaDivizori *= tmp2;
sumaDivizori %= MOD;
}
}
}
printf("%i %i\n", nrDivizori, sumaDivizori);
}
return 0;
}