Time Limit: 5000MS | Memory Limit: 65536K | |
Total Submissions: 11220 | Accepted: 5480 |
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
Source
上來寫了一個四層for循環,結果直接tle了,優化了幾發還是tle。
將前三項移動到等式右面,就可以降低到O(n^2 + n^3)的複雜度:
-(a1x13+ a2x23+ a3x33 )= a4x43+ a5x53
把等式左面可能的取值放到一個數組中做hash,然後遍歷右面的取值即可。
提交記錄:
1,Wrong Answer 沒有看到題目中的xi!=0 這個條件。
2.TLE 四層循環直接掛掉。。
3.Accepted 修改爲三等循環+兩層循環
代碼:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define oo 0x3f3f3f3f
#define MAX_N 30010
#define MAX_M 510
using namespace std;
int a1, a2, a3, a4, a5;
int x1, x2, x3, x4, x5;
int data[50*50*50*10] = {0};
int data1[60] = {0};
short int hash[50*50*50*50*4 + 100] = {0};
map m;
int main() {
int i;
for (i = 0; i <= 50; i++) {
data[i*i*i] = i;
data1[i] = i*i*i;
}
vector::iterator it;
int mod = 50*50*50*50*2;
while (EOF != scanf("%d%d%d%d%d", &a1, &a2, &a3, &a4, &a5)) {
int result = 0, tmp;
memset(hash, 0, sizeof(hash));
for (x1 = -50; x1 <= 50; x1++) {
int x13;
if (x1 < 0) x13 = - data1[-x1] * a1;
else x13 = data1[x1] * a1;
if (x1 != 0)
for (x2 = -50; x2 <= 50; x2++) {
int x23;
if (x2 < 0) x23 = - data1[-x2] * a2;
else x23 = data1[x2] * a2;
if (x2 != 0)
for (x3 = -50; x3 <= 50; x3++) {
int x33;
if (x3 < 0) x33 = - data1[-x3] * a3;
else x33 = data1[x3] * a3;
if (x3 != 0) {
tmp = x13 + x23 + x33;
tmp = -tmp;
if (tmp < mod && tmp+mod >= 0)
hash[tmp+mod]++;
//if (m.find(tmp) != m.end()) m[tmp]++;
//else m[tmp] = 1;
}
}
}
}
for (x4 = -50; x4 <= 50; x4++) {
if (x4 != 0) {
int x43;
if (x4 < 0) x43 = -data1[-x4] * a4;
else x43 = data1[x4] * a4;
for (x5 = -50; x5 <= 50; x5++) {
if (!x5) continue;//排除了那種特殊情況
int x53;
if (x5 < 0) x53 = -data1[-x5] * a5;
else x53 = data1[x5] * a5;
tmp = x43 + x53;
result += hash[tmp+mod];
//if (m.find(tmp) != m.end()) result += m[tmp];
}
}
}
cout << result << endl;
}
return 0;
}