题解 CF1188B 【Count Pairs】
建议在我的博客阅读,要不然
看这个式子:
大家都知道平方差公式吧:
那么把这个式子乘上一个
即:
把
就可以用map
时间复杂度还不够低?
请出tr1::unordered_map,这是一个时间复杂度为map,使用方法见我的代码
code:
#include<bits/stdc++.h>
#include<tr1/unordered_map>
#define int long long
using namespace std;
int n,p,k,a[300001],b[300001];
tr1::unordered_map<int,int>ma;
int qpow(int a,int b){
if(b==0)return 1;
int tmp=qpow(a,b/2);
return b%2?tmp*tmp%p*a%p:tmp*tmp%p;
}
int ans=0;
main(){
scanf("%lld%lld%lld",&n,&p,&k);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
for(int i=1;i<=n;i++){
b[i]=(qpow(a[i],4)-k*a[i]%p)%p;
while(b[i]<0)b[i]=(b[i]+p)%p;
}
for(int i=1;i<=n;i++){
ans+=ma[b[i]];
ma[b[i]]++;
}
printf("%lld\n",ans);
return 0;
}