Hust oj 1013 Eqs(哈希)

Eqs
Time Limit: 5000 MSMemory Limit: 65536 K
Total Submit: 568(229 users)Total Accepted: 332(213 users)Rating: Special Judge: No
Description
Consider equations having the following form:
a1x1 3+ a2x2 3+ a3x3 3+ a4x4 3+ a5x5 3=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,让你求出满足a1x1 3+ a2x2 3+ a3x3 3+ a4x4 3+ a5x5 3=0 的解有多少个,xi的范围是-50到50,这题拿来一看就不可能是暴力,但我们可以把式子拆开,分别求a1x1 3+ a2x2 3和 a3x3 3+ a4x4 3+ a5x5 3,这样复杂度就从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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值