#P0061. 数列同积 | Hybrid

数列同积 | Hybrid

题目背景

这题是个错题(数据范围过大),仅用于偷鸡训练

题目描述

给定两个长度为 nn 的数组 a,ba,b 判断是否能够分别从 aa 和 bb 中各找两个数 ai,aj,bx,bya_i,a_j,b_x,b_y ,

使得 aiaj=bxby(1≤i<j≤n,1≤x<y≤n)a_ia_j=b_xb_y(1\le i<j\le n,1\le x<y\le n)

输入格式

  • 第一行一个正整数 nn。
  • 第二行 nn 个整数 a1,a2,...,ana_1,a_2,...,a_n
  • 第三行 nn 个整数 b1,b2,...,bnb_1,b_2,...,b_n

输出格式

若存在,输出 yes,否则输出 no

样例

10
1 2 3 4 5 6 7 8 9 10
-8 0 54 33 2 1 1 6 6 0
yes

数据范围

  • %50:1≤n≤200,−103≤ai,bi≤103 \%50: 1\le n \le 200, -10^3\le a_i,b_i\le 10^3%
  • %100:1≤n≤108,−109≤ai,bi≤109\%100:1\le n\le 10^8,-10^9\le a_i,b_i\le 10^9

特殊提示

下面代码可以获得50pts:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 2e5 + 5;

int a[N], n, m, b[N];
map<ll, int> mp;
ll c[N], d[N];

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i <= n; i++)
		cin >> b[i];
		
	for (int i = 1; i <= n; i++)
		for (int j =  i + 1; j <= n; j++)
			mp[a[i] * a[j]] = 1;
	bool f = 0;
	for (int i=1; i <= n; i++) {
		for (int j = i + 1; j <= n; j++)
			if (mp[b[i] * b[j]] == 1) {
				f = 1;
				break;
			}
	}
	if (f)
		cout << "yes";
	else
		cout << "no";
	return 0;
}