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
原创粉丝点击