Pagini recente » Cod sursa (job #675061) | Arhiva de probleme | Cod sursa (job #14456) | Cod sursa (job #1780843) | Cod sursa (job #1183714)
#include <cstdio>
#include <cmath>
#define MAX 1000014
#define PRIME_MAX 100000
#define op %9973
using namespace std;
bool boolish[MAX];
int prime[PRIME_MAX],np;
void ciur();
int pow(int x,int y);
int main()
{
int n,fact;
long long x;
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
ciur();
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%lld",&x);
int number=1,suma=1;
for(int j=1;j<=np and x>1;++j){
fact=0;
while(x%prime[j]==0){
++fact;
x/=prime[j];
}
number*=(fact+1);
int p1=(pow(prime[j],fact+1)-1)op;
int p2=pow(prime[j]-1,9971)op;
suma=(((suma*p1)op)*p2)op;;
}
if(x>1) {
number*=2;
suma=(1LL*suma*(x+1)op);
}
printf("%d %d\n",number,suma op);
}
return 0;
}
void ciur()
{
int n=1000000,i,j,lim;
lim=(int)sqrt((double)n);
prime[1] = 2; np = 1;
for (i=3; i<=lim; i=i+2)
if (boolish[i]==0){
for (j=i*i; j<=n; j=j+2*i)
boolish[j]=1;
prime[++np]=i;
}
for(i=prime[np]+2; i<=n; i=i+2)
if(boolish[i]==0)
prime[++np]=i;
}
int pow(int x,int y){
int rez;
for(rez=1;y;y>>=1){
if(y&1){
rez=(1LL*rez*x)op;
}
x=(1LL*x*x)op;
}
return rez op;
}