题目.
本题还是考察关于模的性质
我自己的想法是利用map记录数字对100取模之后的余数的个数,当然需要区分一个数字除去后两位的前面部分是奇数还是偶数。因为偶数减去偶数,奇数减去奇数,才能整除200。之后就是计算总个数,只计算map的键值大于等于2的,利用n*(n-1)/2的规律(很容易总结出来)对不同的map的键进行计算并累加求和即可。记住数据类型用long long。比赛也是这个思路,但是没开long long,一直WA,百思不得其解。
#include <cstdio>
#include <map>
using namespace std;
typedef long long ll;
int main()
{
ll n, a;
scanf("%lld", &n);
map<ll, ll> mp1;
map<ll, ll> mp2;
for(ll i=0; i<n; i++){
scanf("%lld", &a);
if((a/100)%2==1)
mp1[a%100]+=1;
else
mp2[a%100]+=1;
}
ll cnt=0;
map<ll, ll>::iterator it;
for(it=mp1.begin(); it!=mp1.end(); it++){
if(it->second>=2)
cnt+=(it->second-1)*it->second/2;
}
for(it=mp2.begin(); it!=mp2.end(); it++){
if(it->second>=2)
cnt+=(it->second-1)*it->second/2;
}
printf("%lld\n", cnt);
return 0;
}
还有一种就是直接对200进行取模,利用map统计个数,这样就不用分辨奇数和偶数了。也记得开long long
#include <cstdio>
#include <map>
using namespace std;
typedef long long ll;
int main()
{
ll n, a;
ll sum=0;
scanf("%lld", &n);
map<ll, ll> mp;
for(ll i=0; i<n; i++){
scanf("%lld", &a);
mp[a%200]+=1;
}
map<ll, ll>::iterator it;
for(it=mp.begin(); it!=mp.end(); it++){
if(it->second>=2)
sum+=(it->second-1)*it->second/2;
}
printf("%lld\n", sum);
return 0;
}