Codeforces 1189E. Count Pairs
可以算是纯数学题了吧...
看到这个 $(x+y)(x^2+y^2)$ 就可以想到化简三角函数时经常用到的操作,左右同乘
那么 $(a_i+a_j)(a_i^2+a_j^2) \equiv k \mod P$ 其实相当于 $(a_i+a_j)(a_i-a_j)(a_i^2+a_j^2) \equiv k(a_i-a_j) \mod P$
$(a_i^2-a_j^2)(a_i^2+a_j^2)\equiv k(a_i-a_j) \mod P$
$(a_i^4-a_j^4)\equiv ka_i-ka_j \mod P$
$a_i^4-ka_i\equiv a_j^4-ka_j \mod P$
所以就做完了
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<map> using namespace std; typedef long long ll; inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } const int N=3e5+7; int n,P,K; map <int,int> cnt; ll ans; int main() { n=read(),P=read(),K=read(); for(int i=1;i<=n;i++) { int x=read(); x=(1ll*x*x%P*x%P*x%P-1ll*x*K%P+P)%P; ans+=cnt[x]; cnt[x]++; } printf("%lld\n",ans); return 0; }