【 Codeforces Round #572 (Div. 2)】E. Count Pairs(數學)

題面

題意:

現在有一個長度爲nn的數組aa,找出有多少對(i,j)(i,j)滿足11\leqi<ji<jn\leq n並且(ai+aj)(ai2+aj2)modp==k(a_i+a_j)*(a_i^{2}+a_j^{2})modp==k

思路:

左右同乘(aiaj)(a_i-a_j),則式子化爲(ai4aj4)mod(a_i^{4}-a_j^{4})mod p==p== k(aiaj)k*(a_i-a_j) modmod pp
移項得:
(ai4kai)(a_i^{4}-k*a_i) modmod p==p== (aj4kaj)(a_j^{4}-k*a_j) modmod pp .
因此我們至於要統計每個(ai4kai)(a_i^{4}-k*a_i) modmod pp出現的次數,再累加即可,mapmapsetset可以O(nlog(n))O(nlog(n))的解決這個問題。

#include<bits/stdc++.h>

using namespace std;
set<long long > s;
map<long long ,long long > mmp;
int main(){
	long long n,p,x,k;
	cin>>n>>p>>k;
	for(int i=1;i<=n;i++){
		cin>>x;
		mmp[((x%p*x%p*x%p*x%p)%p-(k%p*x%p)+p)%p]++;
		s.insert(((x%p*x%p*x%p*x%p)%p-(k%p*x%p)%p+p)%p);
	}
	long long ans=0;
	for(long long v:s){
		ans+=(mmp[v]*(mmp[v]-1)/2);
	}
	cout<<ans<<endl;
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章