Codeforces 1188B Count Pairs (同余+分离变量)
题意:
给一个3e5的数组,求(i,j)对数,使得$(a_i+a_j)(a_i^2+a_j^2)\equiv k\ mod\ p$
思路:
化简$(a_i^4-a_j^4)\equiv k(a_i-a_j)\ mod\ p$
分离变量$a_i^4-ka_i\equiv (a_j^4-ka_j)\ mod\ p$
于是就变成了常规题
代码:
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<stack> #include<queue> #include<deque> #include<set> #include<vector> #include<map> #define fst first #define sc second #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) #define lson l,mid,root<<1 #define rson mid+1,r,root<<1|1 #define lc root<<1 #define rc root<<1|1 //#define lowbit(x) ((x)&(-x)) using namespace std; typedef double db; typedef long double ldb; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> PI; typedef pair<ll,ll> PLL; const db eps = 1e-6; const int mod = 1e9+7; const int maxn = 2e6+100; const int maxm = 2e6+100; const int inf = 0x3f3f3f3f; const db pi = acos(-1.0); ll a[maxn]; map<ll, ll>ma; int main(){ ll n, p, k; scanf("%lld %lld %lld", &n, &p, &k); for(int i = 1; i <= n; i++){ scanf("%lld", &a[i]); ll x = a[i]; ll res = x*x%p*x%p*x%p-k*x%p; res=(res+p)%p; ma[res]++; } ll ans = 0; for(auto it = ma.begin(); it != ma.end(); it++){ ll x = (*it).sc; //printf("%lld %lld\n", (*it).fst, x); ans+=(x-1)*x/2; } printf("%lld",ans); return 0; } /* */