求i<j<p<q w[i]×w[p]=w[j]×w[q]总数 STL map SRM 671 div1 500: BearDarts

博客介绍了如何使用STL Map解决一道TopCoder上的数学题目,涉及数组四元组(i, j, p, q),要求满足i < j < p < q且w[i]*w[p] = w[j]*w[q],通过转换为比例关系并枚举数组元素,利用Map高效查找满足条件的数对。" 114476675,10681660,C++解决公交换乘最短路程问题,"['算法', '图论', '搜索算法', '数据结构', 'C++编程']
摘要由CSDN通过智能技术生成

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]

我们先来枚举ab 那么问题就变成了有多少对(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;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值