Description |
Consider equations having the following form: |
Input |
For each test case : Line 1: Five coefficients a1, a2, a3, a4, a5, separated by blanks. Process to the end of file. |
Output |
For each test case : Line 1: A single integer that is the number of the solutions for the given equation.(The output will fit in 32 bit signed integers.) |
Sample Input |
37 29 41 43 47 |
Sample Output |
654 |
此题如果遍历的话,时间复杂度将高达O(n^5),肯定会超时。
所以这道题的技巧是以提高空间复杂度为代价,减少时间复杂度。
具体为,把式子分成两部分,a1*x1^3 + a2*x2^3 和 a3*x3^3 + a4*x4^3 + a5*a5^5。
当前后两部分互为相反数时,即为一种解。
所以用一个数组用来存储前一部分得数的出现次数(例如:num[100] = 6 的意思就是前面部分所有情况中有6个情况等于100)
ac代码:
#include<cstdio>
#include<cstring>
using namespace std;
char num[37500050];
int main()
{
int i, j, k;
int a, b, c, d, e;
while(scanf("%d%d%d%d%d", &a, &b, &c, &d, &e) != EOF)
{
memset(num, 0, sizeof(num));
for(i = -50; i <= 50; i++)
{
if(i == 0)
continue;
for(j = -50; j <= 50; j++)
{
if(j == 0)
continue;
int sum;
sum = i*i*i*a + j*j*j*b;
if(sum < 0)
sum += 37500050;
num[sum]++;
}
}
int ans = 0;
for(i = -50; i <= 50; i++)
{
if(i == 0)
continue;
for(j = -50; j <= 50; j++)
{
if(j == 0)
continue;
for(k = -50; k <= 50; k++)
{
if(k == 0)
continue;
int sum;
sum = i*i*i*c + j*j*j*d + k*k*k*e;
sum = -sum;
if(sum < 0)
sum += 37500050;
ans += num[sum];
}
}
}
printf("%d\n", ans);
}
return 0;
}
如发现问题或者不足之处,欢迎在下方评论指出~