給定一個質數 \(p\) , 一個長度爲 \(n\)n 的序列 \(a = \{ a_1,a_2,\cdots,a_n\}\)一個整數 \(k\)。ios
求全部數對 \((i, j)\) (\(1 \le i 、j \le n\))中知足 \((a_i + a_j) \times (a_i^2 + a_j^2 ) \equiv k (\bmod p)\)的個數。ui
對於題中的柿子:this
\[(a_i + a_j) \times (a_i^2 + a_j^2 ) \equiv k (\bmod p)\]spa
咱們能夠在兩邊同時乘上\((a_i - a_j)\):code
\[(a_i^4 - a_j^4 ) \equiv k \times (a_i - a_j) (\bmod p)\]get
移項變換一下可得:io
\[a_i^4 - k \times a_i \equiv a_j^4 - k \times a_j (\bmod p)\]class
而後答案就呼之欲出了——把每一個\(a_i^4 - k \times a_i\)插入\(map\)統計便可。map
#include<cstdio> #include<map> using namespace std; #define ll long long #define rg register struct ios{ template<typename TP> inline ios operator >> (TP &x) { TP f=1;x=0;rg char c=getchar(); for(;c>'9' || c<'0';c=getchar()) if(c=='-') f=-1; for(;c>='0' && c<='9';c=getchar()) x=(x<<3)+(x<<1)+(c^'0'); x*=f; return *this; } template<typename TP> inline ios operator << (TP x) { int top=0,s[66]; if(x<0) x=-x,putchar('-'); if(!x) putchar('0'); while(x) s[++top]=x%10+'0',x/=10; while(top) putchar(s[top--]); return *this; } inline ios operator << (char s) { putchar(s); return *this; } }io; const int N=3e5+5; int n,a,k,p,ans; map<int,int>m; int main() { io>>n>>p>>k; for(rg int i=1;i<=n;++i) { io>>a; int temp=(1ll*a*a%p*a%p*a-1ll*k*a%p+p)%p; ans+=m[temp],++m[temp]; } io<<ans; return 0; }