链接:
https://codeforces.com/problemset/problem/1520/D
题意:
给一串数组,计算有多少组数i,j满足i<j and aj−ai=j−i。
本题记录每一个数对于自己位置的偏移量,相同的偏移量意味着,两个数可以组成一组。最后从每个相同偏移量的数字里选两个,可以用数学排列组合的公式计算C52.即cnt*(cnt-1)/2。
代码如下:
#include<iostream>
#include<vector>
#include<cmath>
#include<set>
#include<map>
#include<algorithm>
#include<string>
#include<string.h>
#include<random>
#include<queue>
using namespace std;
typedef long long ll;
ll a[200003];
ll dis[200003];
map<ll, ll>mp;
int main() {
int T;
cin >> T;
while (T--) {
mp.clear();
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
dis[i] = a[i] - i;
mp[dis[i]]++;
}
ll ans = 0;
for (auto i : mp) {
ans += i.second * (i.second - 1) / 2;
}
cout << ans;
cout << endl;
}
return 0;
}