链接
https://codeforces.com/contest/1188/problem/B
题解
数学功底薄弱的我在这题自闭了
其实就是个初中题(555)
等式两边同时乘以
(
a
i
−
a
j
)
(a_i-a_j)
(ai−aj)
(
a
i
−
a
j
)
(
a
i
+
a
j
)
(
a
i
2
+
a
j
2
)
≡
k
(
a
i
−
a
j
)
m
o
d
  
p
(a_i-a_j)(a_i+a_j)(a_i^2+a_j^2) \equiv k(a_i-a_j)\mod p
(ai−aj)(ai+aj)(ai2+aj2)≡k(ai−aj)modp
然后得到
(
a
i
2
−
a
j
2
)
(
a
i
2
+
a
j
2
)
≡
k
(
a
i
−
a
j
)
m
o
d
  
p
(a_i^2-a_j^2)(a_i^2+a_j^2)\equiv k(a_i-a_j)\mod p
(ai2−aj2)(ai2+aj2)≡k(ai−aj)modp
然后得到
a
i
4
−
k
a
i
≡
a
j
4
−
k
a
j
m
o
d
  
p
a_i^4-ka_i \equiv a_j^4-ka_j \mod p
ai4−kai≡aj4−kajmodp
然后就做完了!
啊,这题真的是彻底把我教做人了
代码
#include<bits/stdc++.h>
#define maxn 300010
#define linf (1ll<<60)
#define iinf 0x3f3f3f3f
#define eps 1e-8
#define cl(x) memset(x,0,sizeof(x))
#define mod 998244353ll
using namespace std;
typedef long long ll;
ll read(ll x=0)
{
int c, f=1;
for(c=getchar();!isdigit(c);c=getchar())if(c=='-')f=-f;
for(;isdigit(c);c=getchar())x=x*10+c-48;
return f*x;
}
ll a[maxn];
unordered_map<ll,ll> cnt;
int main()
{
ll N, i, k, p, ans(0), t;
N=read(), p=read(), k=read();
for(i=1;i<=N;i++)
{
a[i]=read();
t=a[i]*a[i]%p;
t=t*t%p;
t=t-k*a[i];
t=(t%p+p)%p;
ans+=cnt[t];
cnt[t]++;
}
cout<<ans;
return 0;
}