这道题真是有着不堪回首的过去。。
那是。。。。成都之后还是之前,决定是否去杭州的一场和小朋友的“友谊赛”。。
一开始延续了当时的思路。。但是还是T,使用mod的 hash 时间复杂度还是不够。
不过幸好由于数字比较小,杀手锏直接开个大数组记录答案的个数。
前两个变量一组,后三个变量一组,速度还挺快。
不过数组用char来开就足够了,用int开的话会MLE。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <map>
#include <assert.h>
using namespace std;
const int MAX = 12500000;
int coef[10];
char sum[MAX*3+1];//25 000 000
int cube(int a)
{
return a*a*a;
}
int myback(int i,int j,int k)
{
return -(coef[2]*cube(i)+coef[3]*cube(j)+coef[4]*cube(k));
}
int myfront(int i,int j)
{
return coef[0]*cube(i)+coef[1]*cube(j);
}
int main()
{
freopen("acm.in","r",stdin);
while(scanf("%d",&coef[0])!=EOF)
{
memset(sum,0,sizeof(sum));
for(int i=1;i<=4;i++)
scanf("%d",&coef[i]);
for(int i=-50;i<=50;i++)
{
if(i!=0)
for(int j=-50;j<=50;j++)
{
if(j!=0)
{
int t=myfront(i,j)+MAX;
sum[t]++;
}
}
}
int ans=0;
for(int i=-50;i<=50;i++)
{
if(i!=0)
for(int j=-50;j<=50;j++)
{
if(j!=0)
for(int k=-50;k<=50;k++)
{
if(k!=0)
{
int t=myback(i,j,k)+MAX;
if(t>=0&&t<=MAX*2)
ans+=sum[t];
}
}
}
}
printf("%d\n",ans);
}
return 0;
}