/*
这题10^8的暴力可以出答案 但是 慢.....
有个小小的bug 出题人卡int 却没注意short
用short可以不用hash 直接搞
49428K 313MS
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define base 12500000
using namespace std;
int a1,a2,a3,a4,a5,x1,x2,x3,x4,x5,ans;
short f[12500000*2+100];
int main()
{
scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);
for(x1=-50;x1<=50;x1++)if(x1)
for(x2=-50;x2<=50;x2++)if(x2)
{
int s=a1*x1*x1*x1+a2*x2*x2*x2;
s+=base;f[s]++;
}
for(x3=-50;x3<=50;x3++)if(x3)
for(x4=-50;x4<=50;x4++)if(x4)
for(x5=-50;x5<=50;x5++)if(x5)
{
int s=a3*x3*x3*x3+a4*x4*x4*x4+a5*x5*x5*x5;
if(s>12500000||s<-12500000)continue;
s=-s;s+=base;ans+=f[s];
}
printf("%d\n",ans);
return 0;
}
/*
突然觉得自己没学过hash一样.....
这题的问题在于 两部分计算出的答案需要存一下
但是数很大 作为下标存不下 那就行办法叫他不做下标
对于每个值s 计算它的hsah值 把这个值控制在一定范围里
当然这样一搞很大概率会重复 不要紧 我们用边表挨着存下来
把hash值作为点的编号 然后指向s
查找某个s有几个对应的 的时候 就把s的hash值指向的值遍历一下
统计有几个与s相同的
12412K 891MS
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1000010
#define mod 1000007
using namespace std;
int a1,a2,a3,a4,a5,x1,x2,x3,x4,x5,ans;
int head[maxn],num;
struct node{int v,pre;}e[maxn];
void Add(int to)
{
int x;x=to>0?to:-to;
int from=(x%mod+x/mod)%mod;
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
int find(int to)
{
int ret=0;int x;x=to>0?to:-to;
int from=(x%mod+x/mod)%mod;
for(int i=head[from];i;i=e[i].pre)
if(e[i].v==to)ret++;
return ret;
}
int main()
{
scanf("%d%d%d%d%d",&a1,&a2,&a3,&a4,&a5);
for(x1=-50;x1<=50;x1++)if(x1)
for(x2=-50;x2<=50;x2++)if(x2)
for(x3=-50;x3<=50;x3++)if(x3)
{
int s=a1*x1*x1*x1+a2*x2*x2*x2+a3*x3*x3*x3;
Add(s);
}
for(x4=-50;x4<=50;x4++)if(x4)
for(x5=-50;x5<=50;x5++)if(x5)
{
int s=a4*x4*x4*x4+a5*x5*x5*x5;
ans+=find(s);
}
printf("%d\n",ans);
return 0;
}
/*最后贴一下我同桌的 二分查找 704K 1907MS */
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define maxn 10010
using namespace std;
int a[6],x[6],f[200],tot,ans,p[maxn];
int main()
{
int i,j,k;
for(i=1;i<=5;i++)
scanf("%d",&a[i]);
for(x[1]=-50;x[1]<=50;x[1]++)
{
if(x[1]==0)continue;
for(x[2]=-50;x[2]<=50;x[2]++)
{
if(x[2]==0)continue;
int sum=a[1]*x[1]*x[1]*x[1]+a[2]*x[2]*x[2]*x[2];
p[++tot]=sum;
}
}
sort(p+1,p+tot+1);
for(x[3]=-50;x[3]<=50;x[3]++)
{
if(x[3]==0)continue;
for(x[4]=-50;x[4]<=50;x[4]++)
{
if(x[4]==0)continue;
for(x[5]=-50;x[5]<=50;x[5]++)
{
if(x[5]==0)continue;
int sum=a[3]*x[3]*x[3]*x[3]+a[4]*x[4]*x[4]*x[4]+a[5]*x[5]*x[5]*x[5];
ans+=(upper_bound(p+1,p+tot+1,-sum)-p)-(lower_bound(p+1,p+tot+1,-sum)-p);
}
}
}
printf("%d\n",ans);
return 0;
}