hdu 1496 二分或者哈希

来源:互联网 发布:mac pro 创建文件夹 编辑:程序博客网 时间:2024/06/13 13:10

http://acm.hdu.edu.cn/showproblem.php?pid=1496

Problem Description
Consider equations having the following form: 

a*x1^2+b*x2^2+c*x3^2+d*x4^2=0
a, b, c, d are integers from the interval [-50,50] and any of them cannot be 0.

It is consider a solution a system ( x1,x2,x3,x4 ) that verifies the equation, xi is an integer from [-100,100] and xi != 0, any i ∈{1,2,3,4}.

Determine how many solutions satisfy the given equation.
 

Input
The input consists of several test cases. Each test case consists of a single line containing the 4 coefficients a, b, c, d, separated by one or more blanks.
End of file.
 

Output
For each test case, output a single line containing the number of the solutions.
 

Sample Input
1 2 3 -41 1 1 1
 

Sample Output
390880
题目很简单,只贴代码:

二分:

#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;LL sum[400007];LL ans,k;void erfen(LL t){    int l=0,r=k;    int mid;    while(l<=r)    {        mid=(l+r)/2;        if(sum[mid]==t)        {            ans++;            //printf("%d\n",ans);            for(int x=mid-1; x>=1&&sum[x]==t; x--)            {                if(sum[x]==t)                    ans++;            }            for(int x=mid+1; x<k&&sum[x]==t; x++)            {                if(sum[x]==t)                    ans++;            }            return;        }        else if(sum[mid]<t)            l=mid+1;        else            r=mid-1;    }}int main(){    int a,b,c,d;    while(~scanf("%d%d%d%d",&a,&b,&c,&d))    {        k=0;        if(a>0&&b>0&&c>0&&d>0)        {            printf("0\n");            continue;        }        for(int i=1; i<=100; i++)            for(int j=1; j<=100; j++)                sum[k++]=a*i*i+b*j*j;        sort(sum,sum+k);        ans=0;        for(int i=1; i<=100; i++)            for(int j=1; j<=100; j++)            {                LL t=-(c*i*i+d*j*j);                erfen(t);            }        printf("%I64d\n",ans*16);    }    return 0;}

哈希:

#include <stdio.h>#include <iostream>#include <string.h>using namespace std;const int maxn=1000005;int vis[2000005];int main(){    int a,b,c,d;    while(~scanf("%d%d%d%d",&a,&b,&c,&d))    {        if(a>0&&b>0&&c>0&&d>0)        {            printf("0\n");            continue;        }        int ans=0;        memset(vis,0,sizeof(vis));        for(int i=1;i<=100;i++)            for(int j=1;j<=100;j++)                vis[i*i*a+b*j*j+maxn]++;        for(int i=1;i<=100;i++)            for(int j=1;j<=100;j++)                ans+=vis[-(c*i*i+d*j*j)+maxn];        printf("%d\n",ans*16);    }    return 0;}


0 0
原创粉丝点击