Eqs
| Time Limit: 5000MS | Memory Limit: 65536K | |
| Total Submissions: 9536 | Accepted: 4697 |
Description
Consider equations having the following form:
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.
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
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 果断坑爹。
转化成 a1x13+ a2x23
= a3x33+ a4x43+
a5x53
将左边的结果保存到 哈希表中 。 表中的值对应 (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;
}
本文探讨了一种解决特定形式方程的方法,通过将方程转化为多项式并利用哈希表存储中间结果来优化计算过程,从而高效地计算出满足条件的解的数量。实例演示了如何将方程简化并应用算法进行求解。
1823

被折叠的 条评论
为什么被折叠?



