2020-10-29
dp
567C 1700
题目
原题链接:https://codeforces.com/problemset/problem/567/C
思路
题目大意:给定n个数,问着n个数中有多少个以k为公比长度为3的子序列。
思路:
这道题的思路来自于之前做过的一道题 CF1426F 。其中的精髓都是去记录在这个状态前出现的前一个状态的次数。
然后此题注意特殊处理一下数组中的0以及k=1这两种情况.
代码实现
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
using namespace std;
#define mes0(c) memset((c),0,sizeof(c))
#define fsios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
#define fi first
#define se second
const ll MAX = 2e5 + 5;
const ll ifi = 1e15;
ll n, k, tp, zero;
ll ans;
map<ll, ll> mp, cnt;
int main() {
fsios;
while (cin >> n >> k) {
mp.clear();
ans = zero = 0;
if (k == 1) {
for (int i = 1; i <= n; i++) {
cin >> tp;
if (mp.count(tp))
mp[tp]++;
else
mp.emplace(make_pair(tp, 1));
}
for (auto it = mp.begin(); it != mp.end(); it++) {
tp = it->se;
ans += (tp * (tp - 1) * (tp - 2)) / 6;
}
}
else {
for (int i = 1; i <= n; i++) {
cin >> tp;
if (mp.count(tp))
mp[tp]++;
else
mp.emplace(make_pair(tp, 1));
if (tp % k == 0 && tp != 0)
cnt[tp * k] += mp[tp / k];
else if (tp == 0) zero++;
ans += cnt[tp];
}
ans += zero * (zero - 1) * (zero - 2) / 6;
}
cout << ans << endl;
}
return 0;
}