https://community.topcoder.com/stat?c=problem_statement&pm=13951接
题意:
给定一个含有N(N<=1000)个元素的数组w 求有多少四元组(i,j,p,q)满足
i<j<p<q
w[i]×w[p]=w[j]×w[q]
题解
为了方便我们令a=w[i] b=w[j] c=w[p] d=w[q]
我们先来枚举a和b 那么问题就变成了有多少对(c,d)满足条件
a×c=b×d
于是 a/b=d/c
于是我们可以枚举a,b,查找后面有多少个数对满足条件啦!
具体实现和CF 325 的D题很像,用个map就好啦
map<pair<int,int>,int> mp;
long long ans=0;
int i,j,k,r;
int gcd(int a,int b)
{
while(b!=0)
{
int y=b;
b=a%b;
a=y;
}
return a;
}
class BearDarts {
public:
long long count(vector<int> w) {
mp.clear();
int n=w.size();
ans=0;
for(int j=n-3;j>0;j--)
{
int k=j+1;
for(int r=j+2;r<n;r++)
{
int gg=gcd(w[r],w[k]);
mp[{w[r]/gg,w[k]/gg}]++;
}
for(int i=0;i<j;i++)
{
int gg=gcd(w[j],w[i]);
//pair<int,int> pp={w[i]/gg,w[j]/gg};
if(mp.count(make_pair(w[i]/gg,w[j]/gg)))
{
// cout<<w[i]<<' '<<w[j]<<endl;
ans+=mp[make_pair(w[i]/gg,w[j]/gg)];
}
}
}
return ans;
}
};