第一行输入一个正整数M,下面有M行,每一行都是一个正整数N.
输出共M行,每行都是方程解的个数.
Sample Input:
2
1
2
Sample Output:
1
3
提示:当N=2时,共有三个解 X=4,Y=4; X=3,Y=6;X=6,Y=3.
#include <stdio.h>
#include <math.h>
struct TOne
{
int nFact;
int nExp;
};
struct TStd
{
int nFact[20];
int nExp[20];
int nCnt;
};
TOne tGetOne(int nDiv,int & nNum);
TStd tGetStd(int nNum);
void Input(int nCase);
void vOut(TStd tOut);
int main()
{
int nCase;
scanf("%d",&nCase);
Input(nCase);
return 0;
}
TOne tGetOne(int nDiv,int & nNum)
{
TOne tRet;
tRet.nExp=0;
tRet.nFact=nDiv;
while(0==nNum%nDiv)
{
tRet.nExp++;
nNum/=nDiv;
}
return tRet;
}
TStd tGetStd(int nNum)
{
TStd tRet;
TOne tA;
int i,j,nUpLimit;
nUpLimit=(int)sqrt(nNum*1.0);
i=2;
j=0;
while(i<=nUpLimit)
{
tA=tGetOne(i,nNum);
if(tA.nExp>0)
{
tRet.nFact[j]=tA.nExp;
tRet.nExp[j]=tA.nExp;
j++;
nUpLimit=(int)sqrt(nNum*1.0);
}
i++;
}
if(nNum>1)
{
tRet.nFact[j]=nNum;
tRet.nExp[j]=1;
j++;
}
tRet.nCnt=j;
return tRet;
}
void Input(int nCase)
{
int i,nN;
TStd tAns;
for(i=1;i<=nCase;i++)
{
scanf("%d",&nN);
tAns=tGetStd(nN);
vOut(tAns);
}
}
void vOut(TStd tOut)
{
int i,nOut;
nOut=1;
for(i=0;i<tOut.nCnt;i++)
{
nOut*=(2*tOut.nExp[i]+1);
}
printf("%d\n",nOut);
}