时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
难度:困难
出题人:root
描述
小米游拿到了一个数组,她有若干次询问,每次询问输入一个x,她希望你判断x能否由数组中的两个元素相乘得出。
用数学语言描述,你需要寻找到两个下标i和j(i<j),满足a_i*a_j=x。
输入描述
第一行输入一个正整数n,代表数组的大小。
第二行输入n个正整数a_i,代表数组的元素。
第三行输入一个正整数q,代表询问次数。
接下来的q行,每行输入一个正整数x,代表一次询问。
1 < n,q < 10^5
1< a_i,x < 10^6
输出描述
对于每次询问,如果无法找到两数乘积等于x,请输出-1 -1。
否则输出i和j(i<j),用空格隔开,代表a_i*a_j=x。
用例输入 1
5
1 2 3 2 4
2
4
5
用例输出 1
2 4
-1 -1
提示
样例1说明
第一组询问,输出1 5也是可以的。
第二组询问,显然无法找到两个元素相乘等于5。
cpp
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main() {
int n;
cin >> n;
// 读取数组
vector<int> a(n);
for(int i = 0; i < n; i++) {
cin >> a[i];
}
int q;
cin >> q;
// 对于每个询问进行处理
while(q--) {
int x;
cin >> x;
// 使用哈希表存储元素及其下标
unordered_map<int, int> mp;
bool found = false;
// 遍历数组
for(int i = 0; i < n; i++) {
// 如果 x 能被 a[i] 整除
if(x % a[i] == 0) {
int target = x / a[i];
// 如果之前已经出现过 target
if(mp.count(target)) {
cout << mp[target] + 1 << " " << i + 1 << endl;
found = true;
break;
}
// 将当前元素存入哈希表
mp[a[i]] = i;
}
}
if(!found) {
cout << "-1 -1" << endl;
}
}
return 0;
}