hdu 1299 Diophantus of Alexandria

来源:互联网 发布:烟台彤鑫富汇网络咨询 编辑:程序博客网 时间:2024/04/27 18:15

题目链接: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;}





0 0
原创粉丝点击