Hust oj 1013 Eqs(哈希)

来源:互联网 发布:马云内部讲话知乎 编辑:程序博客网 时间:2024/06/07 20:08
EqsTime Limit: 5000 MSMemory Limit: 65536 KTotal Submit: 568(229 users)Total Accepted: 332(213 users)Rating: Special Judge: NoDescription
Consider equations having the following form:
a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0
The coefficients are given integers from the interval [-50,50].
It is consider a solution a system (x1, x2, x3, x4, x5) that verifies the equation, xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}.

Determine how many solutions satisfy the given equation.
Input

For each test case :

Line 1: Five coefficients a1, a2, a3, a4, a5, separated by blanks.

Process to the end of file.

Output

For each test case :

Line 1: A single integer that is the number of the solutions for the given equation.(The output will fit in 32 bit signed integers.)

Sample Input
37 29 41 43 47
Sample Output
654
给你五个数a1,a2,a3,a4,a5,让你求出满足a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 的解有多少个,xi的范围是-50到50,这题拿来一看就不可能是暴力,但我们可以把式子拆开,分别求a1x13+ a2x23和 a3x33+ a4x43+ a5x53,这样复杂度就从O^5变成了O^3+O^2,两次的值用hash表存一下就好
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int maxn = 25000005;char Hash[maxn];int main(){    int a1,a2,a3,a4,a5;    while(~scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5))    {        memset(Hash,0,sizeof(Hash));        int i,j,k,sum;        for(i=-50;i<=50;i++)        {            if(i != 0)            {                for(j=-50;j<=50;j++)                    if(j != 0){                        sum =i*i*i*a1 + j*j*j*a2;                    if(sum < 0) sum += 25000000;                        Hash[sum]++;                    }            }        }        int ans = 0;        for(i=-50;i<=50;i++)            if(i != 0)            for(j=-50;j<=50;j++)                if(j != 0)                    for(k=-50;k<=50;k++ )                        if(k != 0)                        {                            sum = i*i*i*a3 + j*j*j*a4 + k*k*k*a5;                            if(sum < 0)                                sum += 25000000;                            if(Hash[sum] != 0)                                ans += Hash[sum];                        }        printf("%d\n",ans);    }    return 0;}


0 0
原创粉丝点击