每一年都奔走在自己热爱里

没有人是一座孤岛,总有谁爱着你

Codeforces Round 875 (Div. 2)(D)

Codeforces Round 875 (Div. 2)(D)

D (思维)

这个题意是给你两个数组,ab,我们需要找到这样的二元组(i,j)满足ai×aj=bi+bj,问一共有多少组满足以上条件的二元组

题目还告诉我们数组里面的数字都是不大于n的,那么因为两个数相乘的范围一定是1n的,那么我们可以枚举出较小的那一个a,然后再对其他的nab,那么已知三项,可以求出剩余的一项,就是和我们枚举的这个a所对应的b,所以,我们也要记录当a为此时枚举的数字是对应的b的数量,可以用一个vector来存(用map可能会超时,正好数据范围也不大)

但是还有一个小细节的地方,就是我们需要保证a是有序的(这个解法是在知乎博主那里看到的)而且必须是从大到小的

题解

我后面自己试验了一下,如果不是有序的,那么最后获得的答案可能会少

假设此时的a11

后面有(a,b)(1,1),(1,3)(3,2)(6,3)只有按照从小到大的顺序才可,其他的都是不对的

其中原因我也不是很清楚

这样的话,我们可以造成二元组的一定是a大于等于a1a的乘积越来越大,对于同一个a,b是递增的,那么我们所需的a2是在递减,但是感觉关系不大,还不是很懂为什么一定要排序

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include<cmath>
#include <unordered_map>
#include <array>
#include <cstring>
#include <bitset>
#include <numeric>
using namespace std;
#define int long long 
#define LL long long
#define ios  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define inf 1e18
#define INF 1e18
#define eps 1e-10
#define mem(a,b) memset((a),(b),sizeof(a))
const int maxn=1e6+10;
const int mod=1e9+7;
int tt;
int n;
pair<int,int>x[maxn];
void solve()
{
  cin>>n;
  for(int i=1;i<=n;i++)
  {
    cin>>x[i].first;
  }
  for(int i=1;i<=n;i++)
  {
    cin>>x[i].second;
  }
  sort(x+1,x+1+n);
  int ans=0;
  for(int i=1;i*i<=n<<1;i++)
  {
    vector<int>cnt(n+1,0);
    int a1=i;
    for(int j=1;j<=n;j++)
    {
      int a2=x[j].first;
      int b2=x[j].second;
      int b1=a1*a2-b2;
      if(b1>=1&&b1<=n)
      {
        ans+=cnt[b1];
      }
      if(a1==a2)
      {
        cnt[b2]++;
      }
    }
  }
  cout<<ans<<"\n";
  return ;
}
signed main ()
{
  ios;
 // cin>>t;
  tt=1;
  cin>>tt;
  while (tt--)
  {
    solve();
  }
  system ("pause");
  return 0;
}
posted @   righting  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示