题目链接
题目大意
在一个数组中找出所有的对数(i,j) 使得(ai+aj)(a2i+a2j)≡kmodp.输出符合题意的i,j有多少对
解题思路
两遍同乘(ai -aj)得:(ai4-aj4)mod p = = k*(ai - aj)mod p
移项可得:(ai4 - k*ai)%p = = (aj4 - k aj)%p
所以就是数组中所有(ai4 - kai)%p 相同的对数
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=3e5+5;
long long a[N];
int main()
{
int n;
long long p,k,x;
scanf("%d %lld %lld",&n,&p,&k);
for(int i=1;i<=n;i++)
{
scanf("%lld",&x);
a[i]=(x%p*x%p*x%p*x%p-k%p*x%p+p)%p;
}
sort(a+1,a+1+n);
long long ans=0;
x=0;
for(int i=2;i<=n;i++)
{
if(a[i]==a[i-1])
{
x++;
ans+=x;
}
else
x=0;
}
printf("%lld\n",ans);
return 0;
}