http://acm.hdu.edu.cn/showproblem.php?pid=6128
很好懂得博客:http://blog.youkuaiyun.com/dormousenone/article/details/77340852
想到乘一个ai-aj真的太强了。。。。。
然后用map注意下重复的元素,搞一搞就可以了
#include<bits/stdc++.h>
using namespace std;
long long p;
long long powadd(long long a,long long b)
{
long long ans=0;
while(b)
{
if(b&1)
{
ans=(ans+a)%p;
}
a=(a*2)%p;
b>>=1;
}
return ans;
}
long long a[100005];
map<long long,int>p1,p2,p3;
int main()
{
int T;
cin>>T;
int n,i;
while(T--)
{
p1.clear();
p2.clear();
p3.clear();
cin>>n>>p;
for(i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
long long ans1=0,ans2=0,ans3=0;
for(i=0;i<n;i++)
{
if(a[i])
{
long long now=powadd(powadd(a[i],a[i]),a[i]);
if((now*3)%p==0)
ans1+=p1[a[i]]++;
ans3+=p3[a[i]]++;
}
}
for(i=0;i<n;i++)
{
if(a[i])
{
long long now=powadd(powadd(a[i],a[i]),a[i]);
ans2+=p2[now]++;
}
}
ans2-=ans3;
if(p<=3)
cout<<ans2+ans1<<endl;
else
cout<<ans2<<endl;
}
}