【POJ1840】Eqs
2017-07-23 20:57
253 查看
题目链接:http://poj.org/problem?id=1840
题解:
首先可以想到最简单的五层循环暴力枚举,肯定会超时
我们可以将等式转化一下
a1x31+a2x32+a3<
1444e
/span>x33+a4x34+a5x35=0等价于
a1x31+a2x32=−(a3x33+a4x34+a5x35)
所以只需要分别枚举x1,x2,x3和x4,x5,判断是否是相反数即可
考虑到计算出来的值可能比较大,所以将数字哈希一下,用map即可实现
复杂度O(1003+1002),非常科学
题解:
首先可以想到最简单的五层循环暴力枚举,肯定会超时
我们可以将等式转化一下
a1x31+a2x32+a3<
1444e
/span>x33+a4x34+a5x35=0等价于
a1x31+a2x32=−(a3x33+a4x34+a5x35)
所以只需要分别枚举x1,x2,x3和x4,x5,判断是否是相反数即可
考虑到计算出来的值可能比较大,所以将数字哈希一下,用map即可实现
复杂度O(1003+1002),非常科学
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> using namespace std; int a[6]; map<int,int> hash; int main() { for(int i=1;i<=5;i++) cin>>a[i]; for(int i=-50;i<=50;i++) for(int j=-50;j<=50;j++) { if(i==0||j==0) continue; int tmp=i*i*i*a[1]+j*j*j*a[2]; if(hash.find(tmp)!=hash.end()) hash[tmp]++; else hash[tmp]=1; } long long ans=0; 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; int tmp=-(i*i*i*a[3]+j*j*j*a[4]+k*k*k*a[5]); if(hash.find(tmp)==hash.end()) continue; ans+=hash[tmp]; } printf("%lld\n",ans); return 0; }
相关文章推荐
- poj 1840 Eqs 暴力
- POJ 1840 Eqs [HASH]
- POJ 1840:Eqs 哈希求解五元方程
- POJ 1840 Eqs(模拟+哈希)
- POJ 1840 Eqs(哈希)
- poj 1840 Eqs
- POJ 1840 Eqs(hash表)
- POJ 1840 Eqs 暴力哈希
- HDU-1496-Equations && POJ-1840-Eqs (hash)
- POJ-1840 Eqs 解题报告
- poj1840 Eqs
- POJ 1840 Eqs
- Eqs - POJ 1840 哈希
- POJ 1840 Eqs
- POJ 1840:Eqs 哈希求解五元方程
- POJ 1840 Eqs(哈希表)
- poj 1840 Eqs
- Eqs(POJ--1840
- POJ 1840 Eqs
- POJ 1840 Eqs.cpp 【 Hash 】