思路:我们预处理出每个数分别摸上xy的值,用map存一下,然后遍历每个数,如果a + b是x的倍数的话,那么他们模x的值相加为x,如果a - b是y的倍数的话,那么他们的模y的值相等。
代码:
void solve(){
int n, x, y;
cin >> n >> x >> y;
vector<int>a(n);
for(int i = 0;i < n;i ++)
cin >> a[i];
map<pair<int,int>,int>mp;
for(int i = 0;i < n; i++){
int lx = a[i] % x;
int ly = a[i] % y;
mp[{lx,ly}] ++;
}
int ans = 0;
for(int i = 0;i < n; i++){
int lx = a[i] % x;
int ly = a[i] % y;
int cnt = mp[{(x - lx) % x, ly}];
if((x - lx) % x == lx){
if(cnt)ans += cnt - 1;
}else{
if(cnt)ans += cnt;
}
}
ans /= 2;
cout << ans << endl;
}