「NOIP2019模拟赛day1」可爱女孩的二元组

「NOIP2019模拟赛day1」可爱女孩的二元组

内存限制:256 MiB时间限制:1000 ms输入文件:pairs.in输出文件:pairs.out

题目描述
小W是一个可爱的女孩子,她很喜欢二元组。
现在小W有一个质数\(p\)和一个长度为\(n\)的整数序列\(a\)以及一个整数\(k\),而她最近爱上了一种特殊的二元组\(\rm Shmily~Pair\)
小W认为一个二元组\((i,j)\)\(\rm Shmily~Pair\),当且仅当\((a_i+a_j)(a_i^2+a_j^2) \equiv k \mod p\),其中\(1 \leqslant i<j \leqslant n\)
现在小W想要知道她拥有的整数序列\(a\)中,有多少个二元组是\(\rm Shmily~Pair\)
输入格式
第一行三个整数\(n,p,k\)
第二行\(n\)个整数,描述了一个整数序列\(a\)
输出格式
仅一行,一个整数,表示\(\rm Shmily~Pair\)的个数。
样例
样例输入
6 7 2
1 2 3 4 5 6
样例输出
3
数据范围与提示
对于\(30 \%\)的数据,\(n \leqslant 10^4\)
对于\(60 \%\)的数据,\(n \leqslant 3 \times 10^5\)
对于\(100 \%\)的数据,\(2 \leqslant n \leqslant 5 \times 10^6\)\(2 \leqslant p \leqslant 10^9\)\(0 \leqslant k <p\)
提示
我们先将式子化一下:
\((a^2_i − a^2_j )(a^2_i + a^2_j ) \equiv k(a_i − a_j) \mod p\)
\(a^4_i − a^4_j \equiv ka_i − ka_j \mod p\)
\(a^4_i − ka_i ≡ a^4_j − ka_j \mod p\)
由于\(k\)确定,所以我们将\(a^4_i −ka_i\)取模后丢进\(map\)里,然后就可以统计有多少个数和它相同了。

代码

#include <fstream>
#include <algorithm>
#include <cmath>
#include <map>

std::ifstream fin("pairs.in");
std::ofstream fout("pairs.out");

int main(){
	fin.sync_with_stdio(false);
	fout.sync_with_stdio(false);
	int n,p,k,ans=0;
	fin>>n>>p>>k;
	std::map<int,int> s;
	long long x;
	for(int i=0,tmp;i<n;i++){
		fin>>x;
		tmp=(((((((((x%p)*x)%p)*x%p)*x)%p)-(k*x%p))+p)%p)%p;
		ans+=s[tmp];
		s[tmp]++;
	}
	fout<<ans<<std::endl;
	return 0;
}
posted @ 2019-11-05 15:01  ZhaoChongyan  阅读(126)  评论(0编辑  收藏  举报