这题乍一看我以为是水题,正准备5个for暴力的时候发现不对,貌似会TLE啊,于是就跪了,参考百度学习了一发哈希表,感觉也是极为精妙。特别是那个short的用法,第一次用short,也是赞
这题暴力会TLE,所以思路就是转化式子形式:
枚举左边出现的sum,然后枚举右边,这样大大的降低了复杂度,左边的sum需要打表记录,2*50^4=12500000,可能会出现负数所以得开25000000的数组,int会爆,所以要用short(ps.也是醉了,乍一看水题其实真难)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
short hash[25000001];//2*50^4=25000000;int会爆内存,第一次用short
int main()
{
int a1,a2,a3,a4,a5,x1,x2,x3,x4,x5,sum;
cin>>a1>>a2>>a3>>a4>>a5;
memset(hash,0,sizeof(hash));
for(x1=-50;x1<=50;x1++)
{
if(!x1) continue;
for(x2=-50;x2<=50;x2++)
{
if(!x2) continue;
sum=a1*x1*x1*x1+a2*x2*x2*x2;
if(sum<0) sum+=25000000;
hash[sum]++;//打表记录可以得到的和的次数。
}
}
int cnt=0;
for(x3=-50;x3<=50;x3++)
{
if(!x3) continue;
for(x4=-50;x4<=50;x4++)
{
if(!x4) continue;
for(x5=-50;x5<=50;x5++)
{
if(!x5) continue;
sum=a3*x3*x3*x3+a4*x4*x4*x4+a5*x5*x5*x5;
if(sum<-12500000) continue;//这个sum是上面的式子算不到的,要舍弃
if(sum<0&&sum>=-12500000) sum+=25000000;
cnt+=hash[sum];//这个sum有这些解
}
}
}
printf("%d\n",cnt);
return 0;
}