注意中途可能会爆int。
能组成<a,b>使得b-a是200的倍数的,都满足a%200=b%200;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define se second
const int N=1e5+10;
int n;
map<ll,ll>mp;
int main()
{
cin>>n;
fir(i,1,n)
{
int t;cin>>t;
mp[t%200]++;
}
ll ans=0;
for(auto u:mp)
{
ans+=((ll)u.se*(u.se-1)/2);//这里可能会爆int
}
cout<<ans;
return 0;
}
使用映射统计数组中元素出现次数并计算组合数

这段代码主要解决了一个数学问题,通过遍历输入数组,统计每个元素对200取余后的值出现的次数,并存储在映射中。然后计算所有相同余数值的元素之间两两组合的数量,避免了中间结果导致的整数溢出。最后输出组合总数。

被折叠的 条评论
为什么被折叠?



