传送门 题意:题意很好理解,找出k的倍数的组合数。
思路:暴力会超时,因为a是1到100的元素,所以先算出1到100中i,j乘积是k的倍数。用一个桶来储存,判断i和j是否相同,进行特判。vis可能会爆int,所以要开ll。
题解:
//#include<bits/stdc++.h>
//#define N 100010
using namespace std;
const ll maxn = 1e5 + 5;
const ll minn = 1e9 + 5;
const ll mod = 1000000007;
//ll a[maxn], b[maxn];
ll vis[maxn];
//int ans[maxn];
vector<int>v[maxn];
bool row[maxn], col[maxn];
struct node {
int num;
ll ans;
} s[maxn];
ll a[maxn];
bool cmp(node x, node y) {
return x.ans < y.ans;
}
int main() {
int n, k;
cin >> n >> k;
for(int i = 1; i <= n; i++) {
cin >> a[i];
vis[a[i]]++;
}
ll res = 0;
for(int i = 1; i <= 100; i++)
for(int j = i ; j <= 100; j++) {
if(i * j % k == 0) {
if(i == j) {
res += vis[i] * (vis[i]-1)/2;
} else if(i != j)
res+=vis[i]*vis[j];
}
}
cout << res << endl;
return 0;
}