[CF1188B] Count Pairs - 数学
Description
给定一个质数 (p) , 一个长度为 (n) 的序列 (a_1,a_2,...,a_n)和一个整数 (k),求所有数对 ((i, j) (1 le i,j le n)) 中满足 ((a_i + a_j) * (a_i^2 + a_j^2 ) equiv k mod p) 的个数。
Solution
因为 (p) 是质数,所以任意非零元素有逆元,因此乘法运算满足消去律
这样我们就可以在原式的两侧同时乘上一个 (a_i-a_j),化简得到 (a_i^4 - ka_i = a_j^4 - ka_j mod p)
#include <bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n, k, p;
cin >> n >> p >> k;
vector<int> a(n + 2);
for (int i = 1; i <= n; i++)
cin >> a[i];
auto f = [&](int x) -> int {
x %= p;
return (x * x % p * x % p * x % p - k * x % p + p * 2) % p;
};
map<int, int> mp;
for (int i = 1; i <= n; i++)
mp[f(a[i])]++;
int ans = 0;
for (auto pr : mp)
ans += pr.second * (pr.second - 1) / 2;
cout << ans << endl;
}
signed main()
{
ios::sync_with_stdio(false);
solve();
}