求1/X+1/Y= 1/N的所有正整数解

来源:互联网 发布:html5 微场景源码 编辑:程序博客网 时间:2024/06/05 23:03

第一行输入一个正整数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); }  


0 0
原创粉丝点击