思路:
由条件
a∗c=b∗d
a
∗
c
=
b
∗
d
不难看出,要将其转化成
ab=dc
a
b
=
d
c
那么就先预处理出
w[i]w[j]
w
[
i
]
w
[
j
]
的最简比,并记录。
这里运用lower_bound就可以轻松愉快的求出符合位置关系的相同最简比的个数,那么将答案累加即可。虽然感觉跟DP没有半毛钱关系
code:
#include<bits/stdc++.h>
using namespace std;
#define REP(i,f,t)for(int i=(f),i##_end_=(t);i<=i##_end_;i++)
#define SREP(i,f,t)for(int i=(f),i##_end_=(t);i<i##_end_;i++)
#define DREP(i,f,t)for(int i=(f),i##_end_=(t);i>=i##_end_;i--)
#define db double
#define LL long long
#define INF 0x3f3f3f3f
#define Sz(a) sizeof(a)
#define mcl(a,b) memset(a,b,Sz(a))
#define mcp(a,b) memcpy(a,b,Sz(b))
#define pb push_back
template<class T>inline bool chkmin(T &x,T y){return y<x?x=y,1:0;}
template<class T>inline bool chkmax(T &x,T y){return x<y?x=y,1:0;}
inline LL Max(LL &x,LL y){return x>y?x:y;}
inline LL Min(LL &x,LL y){return x<y?x:y;}
#define N 1005
#define pi pair<int,int>
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
pi cmp(int a,int b){
int d=gcd(a,b);
a/=d;b/=d;
return make_pair(a,b);
}
class BearDarts {
public:
long long count(vector <int> w) {
LL ans=0,x,y;
int n=w.size();
map<pi,vector<int> >dp;
SREP(i,0,n) SREP(j,0,i) dp[cmp(w[j],w[i])].pb(i);
SREP(i,0,n) SREP(j,0,i){
pi x=cmp(w[i],w[j]);
if(!dp.count(x))continue;
vector<int> &V=dp[x];
ans+=lower_bound(V.begin(),V.end(),j)-V.begin();
}
return ans;
}
};