大致题意
思路
由于式子中的判别条件两项混在一起,考虑将其分开,两边同乘 (ai - aj) 得到
ai ^ 4 - aj ^ 4 = k * ( ai - aj ) mod p
ai ^ 4 - k * ai = aj ^ 4 - k * aj mod p
令 bi = ai ^ 4 - k * ai ,就是求 bi = bj mod p 的对数,用unordermap搞一下就行。
代码
注意codeblocks 用unordermap 要开c++11标准 ,但是我的cb开这个好像double只能%f输出,否则会是0.
#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
#define maxm 500006
#define ll long long int
#define INF 0x3f3f3f3f
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
#define mem(a) memset(a,0,sizeof(a))
#define sqr(x) (x*x)
#define inf (ll)2e18+1
#define mod 1000000007
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return f*x;
}
int n,k,p,a[maxn];
unordered_map<int,ll> cnt;
//int cnt[maxn];
int main()
{
//double q=1.5;
//printf("%f\n",q);
n=read();p=read();k=read();
inc(i,1,n){
a[i]=read();
ll tmp=1ll*a[i]*a[i]%p;
tmp=tmp*tmp%p;
tmp=(tmp-(1ll*k*a[i])%p+p)%p;
a[i]=tmp;
}
ll ans=0;
inc(i,1,n){
ans+=cnt[a[i]];
cnt[a[i]]++;
}
printf("%lld\n",ans);
return 0;
}