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

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值