Pagini recente » Cod sursa (job #405298) | Cod sursa (job #2977164) | Cod sursa (job #2841677) | Cod sursa (job #542482) | Cod sursa (job #448188)
Cod sursa(job #448188)
#include<cstdio>
#include<bitset>
#include<vector>
using namespace std;
#define NM 1000000
#define LL unsigned long long
#define pb push_back
#define MOD 9973
vector<int>prim;
LL n,nrd,sum;
size_t g;
bitset <NM> viz;
void ciur()
{
int d=2;
viz[0]=viz[1]=0;
while (d*d<NM)
{
if (viz[d])
{
++d;
continue;
}
for (int i=d*d; i<NM; i+=d)
viz[i]=1;
prim.pb(d);
++d;
}
for (int i=d; i<NM; ++i)
if (!viz[i])
prim.pb(i);
g=prim.size();
}
void divizori(LL x)
{
int num;
nrd=1;
sum=1;
for (int i=0; (LL)prim[i]*prim[i]<=x&&i<g; ++i)
{
if (x%prim[i]!=0)
continue;
num=0;
LL p=1;
while (x%prim[i]==0)
{
++num;
x/=prim[i];
p*=prim[i];
}
nrd=nrd*(num+1);
sum=(((p*prim[i]-1)/(prim[i]-1))%MOD)*sum%MOD;
}
if (x-1)
{
nrd=nrd*2;
sum=(x*x-1)/(x-1)%MOD*sum%MOD;
}
}
int main()
{
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
ciur();
short int t;
scanf("%hd",&t);
while (t--)
{
scanf("%lld",&n);
if (!viz[n])
{
printf("2 %lld\n",n+1);
continue;
}
divizori(n);
printf("%lld %lld\n",nrd,sum);
}
return 0;
}