题意很好懂,注意一下xi不能等于0
思路:智商检测题,一开始想着五重for暴力。。。Orz,后来移向(把a4a5移到右边)了发现减了1e8数量级的复杂度,再次Orz,所以直接三重循环,记录每一次答案,存到哈希表中(多次出现的要++,而且哈希值可能是负的,所以要加上一个比较大的数字),然后再两重循环,ans+=hash【e】就可以了。
然而!这样子开的数组会很大,直接int hash[maxn]会mle。网上看到一个骚操作是short[maxn],这个真的Orz,感觉以前好多mle的题目都是可以改的。(short的范围是2的16次,三万多,而这道题中hash表里存的数量肯定不到三万)
#include<iostream> #include<algorithm> #include<cstdlib> #include<sstream> #include<cstring> #include<bitset> #include<cstdio> #include<string> #include<deque> #include<stack> #include<cmath> #include<queue> #include<set> #include<map> #define INF 0x3f3f3f3f #define CLR(x,y) memset(x,y,sizeof(x)) #define LC(x) (x<<1) #define RC(x) ((x<<1)+1) #define MID(x,y) ((x+y)>>1) using namespace std; typedef pair<int,int> pii; typedef long long ll; const double PI=acos(-1.0); int fact[10]= {1,1,2,6,24,120,720,5040,40320,362880}; const int maxn = 6250000; int n,k; int c[3000]; short hash[maxn*6+10]; int a[6]; int main(){ for(int i=1;i<=5;i++)cin>>a[i]; for(int i=-50,j=1;i<=50;i++,j++){ if(i==0){ j--; continue;} c[j]=i*i*i; } for(int i=1;i<=100;i++){ for(int j=1;j<=100;j++){ for(int k=1;k<=100;k++){ int e=a[1]*c[i]+a[2]*c[j]+a[3]*c[k]+3*maxn; hash[e]++; } } } int ans=0; for(int i=1;i<=100;i++){ for(int j=1;j<=100;j++){ int e=-a[4]*c[i]-a[5]*c[j]+3*maxn; if(hash[e])ans+=hash[e]; } } cout<<ans<<endl; }