Eqs
Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 9536 | Accepted: 4697 |
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.
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
直接搜索复杂度为 100^5 果断坑爹。
转化成
a1x1
3
+ a2x2
3 =
a3x3
3
+ a4x4
3
+ a5x5
3
将左边的结果保存到 哈希表中 。 表中的值对应 (x1,x2)方案的数目。
然后枚举右边所有情况。 查哈希表。
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
struct cube{
cube() { for(int i=0;i<=50;i++) a[i] = i*i*i; }
int operator[](int key)
{
if( key<0 ) return -a[-key];
else return a[key];
}
int a[51];
}Cube;
struct hash{
enum { MOD = 99997 };
hash(){ p = 0; memset(h,-1,sizeof(h)); }
struct node{
int next,key,value;
}Node[10100];
int h[MOD],p;
int f(int key)
{
int k=key%MOD;
return k<0 ? k+MOD : k ;
}
int find(int key)
{
int k = h[ f(key) ];
while( k!= -1 ){
if( Node[k].key == key ) return k;
k = Node[k].next;
}
return -1;
}
void add(int key)
{
int pnode = find(key);
if( pnode>=0 ){
Node[pnode].value++;
}else{ // not exist
Node[p].key = key;
Node[p].value = 1;
Node[p].next = h[ f(key) ];
h[ f(key) ] = p++;
}
}
int value(int key)
{
int pnode = find(key);
if( pnode>=0 ) return Node[pnode].value;
else return 0; // not exist
}
}Hash;
int main()
{
int a[5];
for(int i=0;i<5;i++) cin>>a[i];
for(int i=-50;i<=50;i++){
if( i==0 ) continue;
int c0 = Cube[i] * a[0];
for(int j=-50;j<=50;j++){
if( j==0 ) continue;
int c1 = c0 + Cube[j]*a[1];
Hash.add(c1);
}
}
int ans = 0;
for(int i=-50;i<=50;i++){
if( i==0 ) continue;
int c2 = Cube[i] * a[2];
for(int j=-50;j<=50;j++){
if(j==0) continue;
int c3 = c2 + Cube[j] * a[3];
for(int k=-50;k<=50;k++){
if( k==0 ) continue;
int c4 = c3 + Cube[k]*a[4];
ans += Hash.value(c4);
} // a4
} // a3
} // a2
cout<<ans<<endl;
//system("pause");
return 0;
}