zoukankan      html  css  js  c++  java
  • 「NOIP2019模拟赛day1」可爱女孩的二元组

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

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

    题目描述
    小W是一个可爱的女孩子,她很喜欢二元组。
    现在小W有一个质数(p)和一个长度为(n)的整数序列(a)以及一个整数(k),而她最近爱上了一种特殊的二元组( m Shmily~Pair)
    小W认为一个二元组((i,j))( m Shmily~Pair),当且仅当((a_i+a_j)(a_i^2+a_j^2) equiv k mod p),其中(1 leqslant i<j leqslant n)
    现在小W想要知道她拥有的整数序列(a)中,有多少个二元组是( m Shmily~Pair)
    输入格式
    第一行三个整数(n,p,k)
    第二行(n)个整数,描述了一个整数序列(a)
    输出格式
    仅一行,一个整数,表示( m Shmily~Pair)的个数。
    样例
    样例输入
    6 7 2
    1 2 3 4 5 6
    样例输出
    3
    数据范围与提示
    对于(30 \%)的数据,(n leqslant 10^4)
    对于(60 \%)的数据,(n leqslant 3 imes 10^5)
    对于(100 \%)的数据,(2 leqslant n leqslant 5 imes 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;
    }
    
  • 相关阅读:
    四则运算
    自我介绍
    代练第七天
    代练第六天
    代练第五天
    代练第四天
    补充总结
    对软件工程课程的总结
    作业4:结对编程项目四则运算
    psp记录个人项目花费时间
  • 原文地址:https://www.cnblogs.com/ZhaoChongyan/p/11798491.html
Copyright © 2011-2022 走看看