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

这是一个关于NOIP2019模拟赛的编程题目,题目要求解决可爱女孩的二元组问题,内存限制为256 MiB,时间限制为1000 ms,需要编写程序读取输入文件pairs.in并输出到pairs.out。

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

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

题目描述
小W是一个可爱的女孩子,她很喜欢二元组。
现在小W有一个质数ppp和一个长度为nnn的整数序列aaa以及一个整数kkk,而她最近爱上了一种特殊的二元组Shmily Pair\rm Shmily~PairShmily Pair
小W认为一个二元组(i,j)(i,j)(i,j)Shmily Pair\rm Shmily~PairShmily Pair,当且仅当(ai+aj)(ai2+aj2)≡kmod  p(a_i+a_j)(a_i^2+a_j^2) \equiv k \mod p(ai+aj)(ai2+aj2)kmodp,其中1⩽i<j⩽n1 \leqslant i<j \leqslant n1i<jn
现在小W想要知道她拥有的整数序列aaa中,有多少个二元组是Shmily Pair\rm Shmily~PairShmily Pair
输入格式
第一行三个整数n,p,kn,p,kn,p,k
第二行nnn个整数,描述了一个整数序列aaa
输出格式
仅一行,一个整数,表示Shmily Pair\rm Shmily~PairShmily Pair的个数。
样例
样例输入
6 7 2
1 2 3 4 5 6
样例输出
3
数据范围与提示
对于30%30 \%30%的数据,n⩽104n \leqslant 10^4n104
对于60%60 \%60%的数据,n⩽3×105n \leqslant 3 \times 10^5n3×105
对于100%100 \%100%的数据,2⩽n⩽5×1062 \leqslant n \leqslant 5 \times 10^62n5×1062⩽p⩽1092 \leqslant p \leqslant 10^92p1090⩽k<p0 \leqslant k <p0k<p
提示
我们先将式子化一下:
(ai2−aj2)(ai2+aj2)≡k(ai−aj)mod  p(a^2_i − a^2_j )(a^2_i + a^2_j ) \equiv k(a_i − a_j) \mod p(ai2aj2)(ai2+aj2)k(aiaj)modp
ai4−aj4≡kai−kajmod  pa^4_i − a^4_j \equiv ka_i − ka_j \mod pai4aj4kaikajmodp
ai4−kai≡aj4−kajmod  pa^4_i − ka_i ≡ a^4_j − ka_j \mod pai4kaiaj4kajmodp
由于kkk确定,所以我们将ai4−kaia^4_i −ka_iai4kai取模后丢进mapmapmap里,然后就可以统计有多少个数和它相同了。

代码

#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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值