poj1840Eqs(哈希判重)

本文深入探讨了一种解决复杂方程系统的方法,通过巧妙应用hash表技术优化了计算过程,显著提升了求解效率。具体展示了如何将方程分解并利用hash表避免重复计算,最终实现快速准确地找出所有解。实例分析清晰直观,为读者提供了一个实用的算法解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:

思路:

这道题是一个简单的hash的应用,如果直接暴力的话肯定承受不了5重for循环,所以比赛的时候我先到分成两组,但是后来用到了许多数组,然后想到数字太大,还先到stl判重,
后来搞出来还是在本地跑的很慢,就放弃了。。后来看到题解,不得不说太牛了,我的思路是对的,首先把方程分成左右两边,然后分别暴力,因为计算结果的上限可能达到
50*50*50*50*2=1250000,所以取值范围为-12500000--12500000,所以为了避免冲突,应该将hash数组开到2*1250000+1,为什么加1呢,是因为如果出现-12500000那么加上25000000,那么值为12500000,那么就与正的12500000冲突了。。还有最开始先算的3重循环,还是过了,说明这个题目的数据非常水。。。那么最后这个题目就解决了。。。。还有一个小常识65536KB 差不多能开int型数组1677w左右,所以应该用short型数组。。那么就可以开到25000000了。。。。

题目:

Eqs
Time Limit: 5000MS Memory Limit: 65536K
Total Submissions: 12220 Accepted: 5968

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

The only line of input contains the 5 coefficients a1, a2, a3, a4, a5, separated by blanks.

Output

The output will contain on the first line the number of the solutions for the given equation.

Sample Input

37 29 41 43 47

Sample Output

654

Source


代码:

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

const int maxn=25000000+10;
short hash[maxn];

int a1,a2,a3,a4,a5;


int main()
{
    int ans,temp;
    while(~scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5))
    {
        ans=0;
        memset(hash,0,sizeof(hash));
        for(int i=-50;i<=50;i++)
            for(int j=-50;j<=50;j++)
                  {
                    if(i==0||j==0)  continue;
                    temp=(a1*i*i*i+a2*j*j*j)*(-1);
                    if(temp<0)
                        temp=temp+maxn;
                    hash[temp]++;
                  }
        for(int i=-50;i<=50;i++)
            for(int j=-50;j<=50;j++)
                for(int k=-50;k<=50;k++)
            {
               if(i==0||j==0||k==0)  continue;
               temp=a3*i*i*i+a4*j*j*j+a5*k*k*k;
               if(temp<0)
                  temp=temp+maxn;
               if(hash[temp])
                  ans=ans+hash[temp];
            }
        printf("%d\n",ans);
    }
    return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值