CF1188B Count Pairs

【題目描述】

給定一個質數 \(p\) , 一個長度爲 \(n\)n 的序列 \(a = \{ a_1,a_2,\cdots,a_n\}\)一個整數 \(k\)ios

求全部數對 \((i, j)\) (\(1 \le i 、j \le n\))中知足 \((a_i + a_j) \times (a_i^2 + a_j^2 ) \equiv k (\bmod p)\)的個數。ui

【題解】

對於題中的柿子:this

\[(a_i + a_j) \times (a_i^2 + a_j^2 ) \equiv k (\bmod p)\]spa

咱們能夠在兩邊同時乘上\((a_i - a_j)\)code

\[(a_i^4 - a_j^4 ) \equiv k \times (a_i - a_j) (\bmod p)\]get

移項變換一下可得:io

\[a_i^4 - k \times a_i \equiv a_j^4 - k \times a_j (\bmod p)\]class

而後答案就呼之欲出了——把每一個\(a_i^4 - k \times a_i\)插入\(map\)統計便可。map

\(Code:\)

#include<cstdio>
#include<map>
using namespace std;
#define ll long long
#define rg register
struct ios{
    template<typename TP>
    inline ios operator >> (TP &x)
    {
        TP f=1;x=0;rg char c=getchar();
        for(;c>'9' || c<'0';c=getchar()) if(c=='-') f=-1;
        for(;c>='0' && c<='9';c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
        x*=f;
        return *this;
    }
    template<typename TP>
    inline ios operator << (TP x)
    {
        int top=0,s[66];
        if(x<0) x=-x,putchar('-');
        if(!x) putchar('0');
        while(x) s[++top]=x%10+'0',x/=10;
        while(top) putchar(s[top--]);
        return *this;
    }
    inline ios operator << (char s)
    {
        putchar(s);
        return *this;
    }
}io;
const int N=3e5+5;
int n,a,k,p,ans;
map<int,int>m;
int main()
{
    io>>n>>p>>k;
    for(rg int i=1;i<=n;++i)
    {
        io>>a;
        int temp=(1ll*a*a%p*a%p*a-1ll*k*a%p+p)%p;
        ans+=m[temp],++m[temp];
    }
    io<<ans;
    return 0;
}
相關文章
相關標籤/搜索