Pagini recente » Cod sursa (job #1569451) | Monitorul de evaluare | Cod sursa (job #2786670) | Cod sursa (job #3173956) | Cod sursa (job #408856)
Cod sursa(job #408856)
#include <stdio.h>
#define ll long long
#define NMAX 17
#define MOD 9973
int t,r;
struct div
{
ll a,b;
};
div A[NMAX];
ll n,rez,sum;
void get_divs()
{
ll i;
for (i=2; i*i<=n; i++)
if (n%i==0)
{
A[++r].a=i;
while (n%i==0)
{
n/=i;
A[r].b++;
}
rez*=A[r].b+1;
}
if (n!=1)
{
A[++r].a=n;
A[r].b=1;
rez*=2;
}
}
ll lgput(ll baza,ll exp)
{
ll part=1,part2=baza;
while (exp)
{
if (exp & 1)
part*=part2,part%=MOD;
part2*=part2;
part2%=MOD;
exp>>=1;
}
return part;
}
ll factor(ll baza,ll exp)
{
if (baza%MOD==0)
return 1;
if (baza%MOD==1)
return exp+1;
baza%=MOD;
ll act=lgput(baza,exp+1),act2=lgput(baza-1,MOD-2);
act--;
if (act<0)
act+=MOD;
return (act*act2)%MOD;
}
void get_sum()
{
int i;
for (i=1; i<=r; i++)
sum*=factor(A[i].a,A[i].b),sum%=MOD;
}
void erase()
{
int i;
for (i=1; i<=r; i++)
A[i].b=0;
}
int main()
{
freopen("ssnd.in","r",stdin);
freopen("ssnd.out","w",stdout);
scanf("%d",&t);
while (t)
{
scanf("%lld",&n);
r=0; rez=1; sum=1;
get_divs();
get_sum();
erase();
printf("%lld ",rez);
printf("%lld\n",sum);
t--;
}
return 0;
}