题目大意:给出5个参数a1到a5,然后解出一个方程a1x1^3+ a2x2^3+ a3x3^3+ a4x4^3+ a5x5^3=0 ,使得解出5个解(x1, x2, x3, x4, x5),然后问你有多少组不同的解,然后xi和ai的范围都是,[-50,50],且不等于0
解题思路:
首先如果用暴力算法,将每个x从-50到50循环,然后判断是否等于0,然后100^5,运算1000W次,超时。
然后试着来降低运算复杂度,是不是可以减少次方。
将方程进行变形为-(a1x1^3+ a2x2^3) = a3x3^3+ a4x4^3+ a5x5^3
这样最大运算为100^3,运算10W次
这样比较左右方程式的和是否相等就可以了
当然,判断相等也要开一个数组保存下来,比如 1*3+2*1 和 1*1 + 2 * 2是相等的,但是却是两
种解。所以记录下结果等于5的次数为多少,开一个数组hash[],这个时候记录下hash[5]=2
数组最大开(50 * 50^3 + 50* 50^3)*2 = 25000000,要考虑负数
我们令12500000为0
这样就可以求出多少个解了
最后开hash数组的时候不用short会超内存
#include <iostream> using namespace std; #define MAXV 25000000 int x1,x2,x3,x4,x5; short int hash[MAXV + 1]; //hash数组 int main(){ int a,b,c,d,e; int sum ,ans; while(cin>>a>>b>>c>>d>>e){ memset(hash,0,sizeof(hash)); //初始化 for(x1 = -50;x1 <= 50;x1++){ //算左边一个范围的解 if(x1 == 0) continue; for(x2 = -50;x2 <= 50;x2++){ if(x2 == 0) continue; sum = -(x1*x1*x1*a + x2*x2*x2*b); sum += MAXV/2; //将负数变换为负数 hash[sum]++; //结果累加 } } ans = 0; for(x3 = -50;x3 <= 50;x3++){ if(x3 == 0) continue; for(x4 = -50;x4 <= 50;x4++){ if(x4 == 0) continue; for(x5 = -50;x5 <= 50;x5++){ if(x5 == 0) continue; sum = x3*x3*x3*c + x4*x4*x4*d + x5*x5*x5*e; sum += MAXV/2; //将负数变换为负数 if(sum < 0 || sum >= MAXV) continue; //如果超过左边的结果的范围则不计算 if(hash[sum]){ ans+=hash[sum]; //解的累加 } } } } cout<<ans<<endl; } return 0; }