题解 | 谐距下标对

谐距下标对

https://www.nowcoder.com/practice/12fd032361704c978bcb9c2c2b3bb93d

#include<bits/stdc++.h>
using namespace std;

using ll=long long;
using ull=unsigned long long;
using i128=__int128_t;
using u128=__uint128_t;
using ld=long double;

map<int,int>m;

ll A(int x,int y)//排列
{
	ll sum=1;
	while(y--)
	{
		sum*=x;
		x--;
	}
	return sum;
}

ll C(int x,int y)//组合
{
	return A(x,y)/A(y,y);
}

void solve()
{
	int n;
	cin >> n;
	vector<int>v(n+1,0);
	for(int i=1;i<=n;i++)//转换一下式子 其实等价于aj-j=ai-i 我们可以算出每个vi-i
	{
		cin >> v[i];
		v[i]-=i;
		m[v[i]]++;
	}
	ll ans=0;
	for(auto it=m.begin();it!=m.end();it++)//利用map可以知道每种vi-i有多少个 通过基础的组合数学 可以算出方案数
	{
		if(it->second>=2)
		{
			ans+=C(it->second,2);//n个里面挑两个 就是这一组的下标对数量
		}
	}
	cout << ans;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t=1;
	//cin >> t;
	
	while(t--)
	{
		solve();
	}
	return 0;
}

全部评论

相关推荐

想踩缝纫机的小师弟练...:不理解你们这些人,要放记录就把对方公司名字放出来啊。不然怎么网暴他们
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务