Pagini recente » Cod sursa (job #2501765) | Borderou de evaluare (job #1702885) | Borderou de evaluare (job #2015907) | Borderou de evaluare (job #2006989) | Cod sursa (job #980994)
Cod sursa(job #980994)
#include <cstdio>
#include <cstring>
using namespace std;
long long i,t,e[1069],x,y[1000069],q[1000069],Sd,Nrd,prim[1000069],nr,a,Max,j,w,h[1000069];
bool ok;
int main()
{
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
scanf("%d", &t);
for (i=1;i<=t;i++) {scanf("%d", &e[i]); if (e[i]>Max) Max=e[i];}
prim[1]=2;
nr=1;
for (x=3; x*x<=Max; x+=2)
{
ok=true;
for (i=1; i<=nr && prim[i]*prim[i]<=x; i++)
if (x%prim[i]==0) ok=false;
if (ok) prim[++nr]=x;
}
for (j=1; j<=t; j++)
{
a=e[j];
for (i=1;i<=w;i++) y[i]=q[i]=0;
w=0;
for (i=1; prim[i]*prim[i]<=a; i++)
{
if (prim[i]*prim[i]!=0)
if (a%prim[i]==0)
{
w++; h[w]=prim[i];
while (a%prim[i]==0)
{
y[w]++;
a/=prim[i];
if (q[w]==0) q[w]=prim[i];
else q[w]=q[w]*prim[i];
}
}
if (a==1) break;
}
if (a!=1) {
y[++w]++; h[w]=a;
if (q[w]==0) q[w]=a;
else q[w]=q[w]*w;
}
Nrd=1; Sd=1;
for (i=1; i<=w; i++) Nrd=Nrd*(y[i]+1);
for (i=1; i<=w; i++)
if (q[i]!=0) Sd=Sd*(q[i]*h[i]-1)/(h[i]-1);
printf("%lld %lld\n", Nrd, Sd);
}
return 0;
}