题解:CF1188B Count Pairs
题意:很简单了,不再赘述。
做法:
有一个很经典的问题,化简 \(\prod\limits_{i=2^k} ^{k\le x}(a^i + b^i)\)。
这个可以直接乘上一个 \(a-b\),然后得到 \(a^{2^{x+1}}-a^{2^{x+1}}\)。
那么对于这个题,我们两侧直接乘上 \(a_i-a_j\),得到 \(a_i^4-a_j^4\equiv k\times (a_i-a_j)\pmod{p}\),将 \(a_i,a_j\) 分离,用 map 统计贡献即可。
bonus:如果没有互不相同怎么做。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e5 + 5;
int n, p, k, a[maxn], ans;
map<int, int> mp;
signed main() {
cin >> n >> p >> k;
for (int i = 1; i <= n; i++)
cin >> a[i], a[i] = a[i] * a[i] % p * a[i] % p * a[i] % p - k * a[i] % p;
for (int i = 1; i <= n; i++)
a[i] = (a[i] % p + p) % p;
for (int i = 1; i <= n; i++)
ans += mp[a[i]], mp[a[i]]++;
cout << ans << endl;
return 0;
}

浙公网安备 33010602011771号