Codeforces 1189E. Count Pairs

传送门

可以算是纯数学题了吧...

看到这个 $(x+y)(x^2+y^2)$ 就可以想到化简三角函数时经常用到的操作,左右同乘

那么 $(a_i+a_j)(a_i^2+a_j^2) equiv  k mod P$ 其实相当于 $(a_i+a_j)(a_i-a_j)(a_i^2+a_j^2) equiv  k(a_i-a_j) mod P$

$(a_i^2-a_j^2)(a_i^2+a_j^2)equiv k(a_i-a_j) mod P$

$(a_i^4-a_j^4)equiv ka_i-ka_j mod P$

$a_i^4-ka_iequiv a_j^4-ka_j mod P$

所以就做完了

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
    while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
    return x*f;
}
const int N=3e5+7;
int n,P,K;
map <int,int> cnt;
ll ans;
int main()
{
    n=read(),P=read(),K=read();
    for(int i=1;i<=n;i++)
    {
        int x=read();
        x=(1ll*x*x%P*x%P*x%P-1ll*x*K%P+P)%P;
        ans+=cnt[x]; cnt[x]++;
    }
    printf("%lld
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/LLTYYC/p/11729032.html