题意:对于长度为n的序列,m个询问,每次学问一个数。让你回答序列中乘积不小于它的数对有多少对,n<=1e6
预处理当前序列中不大于当前值的数对有多少,然后用总数减去他的前一个就是答案了
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#define MAX 3000010
using namespace std;
long long n;
long long ct[MAX];
long long num[MAX];
int m;
int main() {
scanf("%d",&n);
for (int i = 0; i < n; i++) {
int a;
scanf("%d",&a);
ct[a]++;
}
for (int i = 1; i * i < MAX; i++) {
for (int j = i; i * j < MAX; j++) {
if (i == j)
num[i * j] += ct[i] * (ct[i] - 1);
else
num[i * j] += 2 * ct[i] * ct[j];
}
}
for (int i = MAX-2; i > 0; i--)
num[i] += num[i+1];
long long x = n * (n - 1) - num[1];
scanf("%d",&m);
while (m--) {
int a;
scanf("%d",&a);
printf("%I64d\n", num[a] + x);
}
}