废话不说,这道题暴力枚举是$O(N^6)$,显然无法承受。
推导一下
$(x_1*x_2+x_3)/x_4-x_5=x_6$
$x_1*x_2+x_3=x_4*(x_5+x_6)$
等式左边和右边的复杂度都是$O(N^3)$的,可以接受!
但是如果没开$O_2$不要用map,会被卡常,g++11的unorderded_map不错,但是大部分OJ并不滋次,建议手写hash,based要卡大点。
//OJ 1869 //by Cydiater //2016.9.13 #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <map> #include <ctime> #include <cmath> #include <cstring> #include <string> #include <algorithm> #include <cstdlib> using namespace std; #define ll long long #define up(i,j,n) for(ll i=j;i<=n;i++) #define down(i,j,n) for(ll i=j;i>=n;i--) const ll oo=0x3f3f3f3f; ; ; inline ll read(){ ,f=; ;ch=getchar();} +ch-';ch=getchar();} return x*f; } ll lable[]; ll N,a[],ans=; struct HashTable{ ll Value[]; HashTable(){up(i,,mod+)Value[i]=-oo;} ll Hash_value(ll num){ ll tmp=num; num%=mod;num+=mod;num%=mod; while(Value[num]!=tmp){ if(Value[num]==-oo){ Value[num]=tmp; return num; } num+=step;num%=mod; } return num; } }hash; namespace solution{ void pret(){ up(i,,N)up(j,,N)up(k,,N))lable[hash.Hash_value(a[i]*(a[j]+a[k]))]++; } void init(){ N=read(); up(i,,N)a[i]=read(); } void slove(){ up(i,,N),N),N)/*x_2*/ ans+=lable[hash.Hash_value(a[i]+a[j]*a[k])]; } void output(){ cout<<ans<<endl; } } int main(){ //freopen("input.in","r",stdin); using namespace solution; init(); pret(); slove(); output(); //cout<<"Time has passed:"<<1.0*clock()/1000<<"s!"<<endl; ; }