POJ1840 原题链接:http://poj.org/problem?id=1840
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 16935 | Accepted: 8312 |
Description
a1x13+ a2x23+ a3x33+ a4x43+ a5x53=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
Output
Sample Input
37 29 41 43 47
Sample Output
654
题目大意:输入一个一个五元三次方程a1x1^3+a2x2^3+a3x3^3+a4x4^3+a5x5^3=0的五个系数a1,a2,a3,a4,a5;求这个方程的解有多少个(数字相同顺序不同视为不同解)
思路:枚举x1~x5的值的复杂度为O(n^5)能过我吃屎,可以把方程稍微变形一下化为:(-1)*(a1x1^3+a2x2^3)=a3x3^3+a4x4^3+a5x5^3
这样可以先枚举x1与x2的值求出(-1)*(a1x1^3+a2x2^3)打表,再枚举右边的x3,x4,x5的值求出a3x3^3+a4x4^3+a5x5^3,若右值等于左值即得到一个解;
定义一个映射数组hash[num]表示num在左值出现的次数,若右值求得的sum在hash[sum]的值不为0,就求得了hash[sum]的解,sum的值上界为50*50^3+50*50^3=12500000因为sum可以为负所以将sum的上界移到25000000,sum<0时,sum+=25000000;
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int hash[25000001]; //hash[sum]表示值等于sum的的解的个数(多对1映射)
int main(void)
{
int a1,a2,a3,a4,a5; //系数
while(cin>>a1>>a2>>a3>>a4>>a5)
{
memset(hash,0,sizeof(hash));
for(int x1=-50;x1<=50;x1++)
{
if(!x1)
continue;
for(int x2=-50;x2<=50;x2++)
{
if(!x2)
continue;
int sum=(a1*x1*x1*x1 + a2*x2*x2*x2)*(-1);
if(sum<0)
sum+=25000000;
hash[sum]++;
}
}
int solution=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;
int sum=a3*x3*x3*x3 + a4*x4*x4*x4 + a5*x5*x5*x5;
if(sum<0)
sum+=25000000;
if(hash[sum])
solution+=hash[sum];
}
}
}
cout<<solution<<endl;
}
return 0;
}