Solution for Codeforces Problem 1188B - Count Pairs
本文章将同步到 Hexo 博客.
题意
给定一个质数
求满足
解析
这是一道数学题.
同余方程有一些性质:
若
也就是说同余方程可以进行移项操作, 也可以两边同时乘一个数, 方程依然成立.
还需要了解的是平方差公式:
知道上面的东西后, 便可以对式子进行一些处理.
两边同时乘
运用平方差公式进行化简
最后, 我们对于每一个 map 中. 所有满足
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n, p, k;
ll a[300001];
map<ll, ll> b;
ll cnt = 0;
template <typename T>
inline T read() {
T x = 0;
T multiplier = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-') {
multiplier = -1;
}
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = (x << 3) + (x << 1) + (ch & 15);
ch = getchar();
}
return x * multiplier;
}
int main() {
n = read<ll>(), p = read<ll>(), k = read<ll>();
for (int i = 1; i <= n; i++) {
a[i] = read<ll>();
ll x = a[i] * a[i] % p * a[i] % p * a[i] % p - a[i] * k % p;
x %= p;
x += (x < 0 ? p : 0);
cnt += b[x]; // 先更新答案
b[x]++; // 后更新 map
}
cout << cnt << '\n';
return 0;
}