CF1188B Count Pairs
\(Link\)
题意: 给定 \(n,p,k\) 和 \(n\) 个数,求数对 \((i,j)(1 \leq i < j \leq n)\),使得
\[(a_i+a_j)(a_i^2+a_j^2) \equiv k\pmod{p}
\]
的个数。
上来就推式子。
\[(a_i+a_j)(a_i^2+a_j^2) \equiv k\pmod{p}
\]
\[(a_i-a_j)(a_i+a_j)(a_i^2+a_j^2) \equiv k(a_i-a_j)\pmod{p}
\]
\[(a_i^2-a_j^2)(a_i^2+a_j^2) \equiv ka_i-ka_j\pmod{p}
\]
\[a_i^4-a_j^4 \equiv ka_i-ka_j\pmod{p}
\]
\[a_i^4-ka_i \equiv a_j^4-ka_j\pmod{p}
\]
然后开一个map存所有的\(a_i^4-ka_i\)的个数就行了。
注意越界。
\(Code:\)
点击查看代码
// Problem: B. Count Pairs
// Contest: Codeforces - Codeforces Round #572 (Div. 1)
// URL: https://codeforces.com/contest/1188/problem/B
// Memory Limit: 256 MB
// Time Limit: 4000 ms
// Author: jimmyywang
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,a,b) for(ll i=a;i<=b;i++)
#define wt int tt=d;while(tt--)
#define py puts("Yes")
#define pn puts("No")
#define fe(i,e) for(int i=0;i<e.size();i++)
#define vi vector<ll>
inline ll rd() {
ll x=0,f=1;
char c=getchar();
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c))x=x*10+c-'0',c=getchar();
return x*f;
}
#define d rd()
#define pb push_back
const ll N=300010;
struct edge{ll v,w,nx;}e[N<<1];
ll hd[N],cnt;
void add(ll u,ll v,ll w){e[++cnt]=(edge){v,w,hd[u]};hd[u]=cnt;}
ll qp(ll a,ll b,ll p){
ll ans=1;while(b){
if(b&1)ans=ans*a%p;
a=a*a%p;b>>=1;
}return ans;
}ll t,n,m,k,p;
ll a[300010],ans;
map<ll,ll>mp;
int main(){
n=d,p=d,k=d;
f(i,1,n)a[i]=d,mp[a[i]*(a[i]*a[i]%p*a[i]%p-k+p)%p]++;
f(i,1,n)ans+=mp[a[i]*(a[i]*a[i]%p*a[i]%p-k+p)%p]-1;
printf("%lld\n",ans/2);
return 0;
}

浙公网安备 33010602011771号