思路:我们预处理出每个数分别摸上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;
}