POJ 1840 - Eqs(数学)
来源:互联网 发布:怎么查看数据库关系 编辑:程序博客网 时间:2024/05/17 02:44
题目:
http://poj.org/problem?id=1840
题意:
给出一个5元3次方程,输入其5个系数,求它的解的个数. 其中系数 ai∈[-50,50] 自变量xi∈[-50,0)∪(0,50]
思路:
简单暴力肯定超时的了, 暴力枚举要5层循环.
看了题解~ 原来要将方程变形: a1*x1^3 + a2*x2^3 + a3*x3^3 + a4 * x4^3 + a5*x5^3 = 0等价于 -(a1*x1^3 + a2*x2^3) = a3*x3^3 + a4 * x4^3 + a5*x5^3 .
先计算左边部分可能出现的值, 用hash[] 记录下来, 然后在计算右边部分可能出现的值, 就可以算出解的个数了,
将复杂度 从O(n^5) 降到 O(n^2+n^3) .
CODE
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxn = 25000000;short hash[25000001];int main(){//freopen("in", "r", stdin); int a1, a2, a3, a4, a5; while(~scanf("%d %d %d %d %d", &a1, &a2, &a3, &a4, &a5)) { memset(hash, 0, sizeof(hash)); int sum = 0; for(int x1 = -50; x1 <= 50; ++x1) { if(!x1) continue; for(int x2 = -50; x2 <= 50; ++x2) { if(!x2) continue; sum = a1*x1*x1*x1 + a2*x2*x2*x2; if(sum < 0) sum += maxn; hash[sum]++; } } int ans = 0; for(int x3 = -50; x3 <= 50; ++x3) { if(!x3) continue; for(int x4 = -50; x4 <= 50; ++x4) { if(!x4) continue; for(int x5 = -50; x5 <= 50; ++x5) { if(!x5) continue; sum = a3*x3*x3*x3 + a4*x4*x4*x4 + a5*x5*x5*x5; if(sum < 0) sum += maxn; ans += hash[sum]; } } } printf("%d\n", ans); } return 0;}
0 0
- POJ 1840 - Eqs(数学)
- poj 1840 Eqs
- POJ 1840 Eqs
- poj 1840 Eqs
- POJ 1840 Eqs
- POJ 1840 Eqs hash
- POJ-1840 Eqs【Hash】
- poj 1840 Eqs 【hash】
- POJ 1840 Eqs
- poj-1840 Eqs
- POJ 1840 Eqs
- POJ 1840 Eqs
- poj 1840 Eqs
- POJ 1840 Eqs
- POJ 1840 Eqs
- POJ 1840(Eqs)
- POJ 1840 Eqs
- POJ 1840 Eqs
- 蓝桥杯算法训练_格子操作_线段树_区间和与区间最值
- 如何减少返工工作量?
- OC面向对象—多态
- 使用baidu push报错
- GIS的学习(二十)基于Geoserver的WFS服务与Openlayers实现地理查询
- POJ 1840 - Eqs(数学)
- 搜索引擎四:CoreSeek配置MySql数据源
- Android2.3解析json出错,4.0不报错
- lzo格式作为输入时调整map个数
- HDOJ 1004 Let the Balloon Rise(排序)
- php端口直驱网络打印机,能自定义格式
- Linux下OpenSSL 安装
- C语言结构体和C 结构体的区别
- poj3262 贪心