首页 > 代码库 > hdu 1299 Diophantus of Alexandria

hdu 1299 Diophantus of Alexandria

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1299

题目大意:就是给你一个n,求1/x+//y=1/n正整数解的个数。

思路:首先我们可以在两边同时乘以xyn得yn+xn=xy,然后因式分解的(x-n)*(y-n)=n*n。这题要求解的个数,就变成了求n*n的因子数,网上很多人都是令y=n+k,然后的x=(n*n)/k+n,这儿也是求n*n的因子数。

通过数论的中的学习我们知道任意一个数n都可以由素数表示出来,即:

    n=p1^e1*p2^e2*p3*e3*......pn^en 。(p1,p2,p3......pn都为素数)    

    因子数为:(1+e1)*(1+e2)*(1+e3)*......*(1+en)      所以对  n*n

    n*n=p1^2e1*p2^2e2*p3^2e3......pn^2en

   因子数为:(1+2*e1)*(1*2*e2)*(1+2*e3)*......*(1+2*en)

所以我们只需要求求出n的素因子。


code:

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;

int vis[40005];
int prime[40005];

int  primetable()
{
    //int m=sqrt(40000+0.5);
    int c=0;
    memset(vis,0,sizeof(vis));
    for(int i=2;i<=40000;i++)
    {
        if(!vis[i])
        {
            prime[c++]=i;
            for(int j=i*i;j<=40000;j+=i)
            {
                vis[j]=1;
            }
        }
    }
    return c;
}


int main()
{

    int i,kk=0;
    int len,T,n,cnt,sum1;
    len=primetable();
    scanf("%d",&T);
    while(T--)
    {
        kk++;
        cnt=1;
        scanf("%d",&n);
        for(i=0;i<len;i++)  //计算素因子的个数
        {
            int m=sqrt(n)+1;
            if(prime[i]>m) break;
            int sum1=0;
            while(n%prime[i]==0)
            {
                sum1++;
                n=n/prime[i];
            }
            cnt*=(1+2*sum1);
        }
        if(n>1) cnt*=3;     //为什么这儿要乘以3,因为前面我们一直在做n/prime[i],但是做到最后不一定n==1,但是这时这个数却不能再被分解啦,所以这个数一定是一个素数,所以要做cnt*(1+2*1)
        printf("Scenario #%d:\n%d\n\n",kk,(cnt+1)/2);  //x与y交换只能算一种,所以要除以2,但是n也是因子之一啊,我们必须加上它做成两个它,再除以二就是了
    }
    return 0;
}





hdu 1299 Diophantus of Alexandria