Codeforces Round 925 (Div. 3) D. Divisible Pairs(数学)

波利卡普有两个最喜欢的整数 x 和 y (它们可以相等),他找到了一个长度为 n 的数组 a 。

波利卡普认为一对索引 ⟨ i , j ⟩ ( 1 ≤ i < j ≤ n ) ⟨i,j⟩ ( 1≤i<j≤n ) i,j(1i<jn)是优美的,如果:

a i + a j a_i+a_j ai+aj 可以被 x x x 整除; a i − a j a_i−a_j aiaj 可以被 y y y 整除。
例如,如果 x = 5 , y = 2 , n = 6 , a = [ 1 , 2 , 7 , 4 , 9 , 6 ] x=5 , y=2 , n=6 , a= [ 1,2,7,4,9,6 ] x=5y=2n=6a=[1,2,7,4,9,6],那么唯一美丽的一对是:
⟨ 1 , 5 ⟩ : a 1 + a 5 = 1 + 9 = 10 ⟨1,5⟩ : a_1+a_5=1+9=10 1,5:a1+a5=1+9=10 ( 10 能被 5 整除)和 a 1 − a 5 = 1 − 9 = − 8 a1−a5=1−9=−8 a1a5=19=8 ( − 8 −8 8 能被 2 2 2 整除);
⟨ 4 , 6 ⟩ : a 4 + a 6 = 4 + 6 = 10 ⟨4,6⟩ : a_4+a_6=4+6=10 4,6:a4+a6=4+6=10 ( 10 能被 5 整除)和 a 4 − a 6 = 4 − 6 = − 2 a4−a6=4−6=−2 a4a6=46=2 ( − 2 −2 2 能被 2 2 2 整除)。
求数组 a 中优美数对的个数。

输入
输入的第一行包含一个整数 t ( 1 ≤ t ≤ 1 0 4 ) 。 ( 1 ≤ t ≤ 1 0 4 ) t ( 1≤t≤10^4 )。( 1≤t≤10^4 ) t(1t104)(1t104) - 测试用例的数量。然后是测试用例的描述。

每个测试用例的第一行包含三个整数 n n n x x x y y y ( 2 ≤ n ≤ 2 ⋅ 1 0 5 、 1 ≤ x , y ≤ 1 0 9 ) ( 2≤n≤2⋅10^5 、 1≤x,y≤10^9 ) (2n21051x,y109)–即数组的大小和波利卡普最喜欢的整数。

每个测试用例的第二行包含 n n n 个整数 a 1 , a 2 , … , a n ( 1 ≤ a i ≤ 1 0 9 ) a_1,a_2,…,a_n ( 1≤a_i≤10^9 ) a1,a2,,an(1ai109) - 数组的元素。

保证所有测试用例中 n n n 的总和不超过 2 ⋅ 1 0 5 2⋅10^5 2105

输出
对于每个测试用例,输出一个整数,即数组 a 中的漂亮配对数。


题目要求时间2s,数据范围为2e9, O ( N 2 ) O(N^2) O(N2)过不了,所以不用想暴力了。
对于此类数学题,可以在给出的公式的基础上进行一些推导。

首先根据题目要求,我们可以得到以下两个式子。
( a i + a j ) m o d x = 0 ( a i − a j ) m o d x = 0 (a_i + a_j)\ \ mod\ \ x = 0 \\(a_i - a_j)\ \ mod \ \ x = 0 (ai+aj)  mod  x=0(aiaj)  mod  x=0
先观察第一个式子,可以对这个式子进行一下演变: ( a i m o d x + a j m o d x ) m o d x = 0 (a_i \ \ mod \ \ x \ \ +\ \ a_j\ \ mod\ \ x)\ \ mod\ \ x = 0 (ai  mod  x  +  aj  mod  x)  mod  x=0
这时候易知: a i m o d x a_i\ \ mod\ \ x ai  mod  x a j m o d x a_j\ \ mod\ \ x aj  mod  x的取值范围均为 [ 0 , x ) [0\ ,\ x) [0 , x),如果想要modx之后得到的得数是0,那么括号里的内容只有可能是x的倍数或者0。

如果是x的倍数,那么就只有可能是x本身,因为二者都无法取到x,那么相加最大值也到不了2x,所以最多只能取到x,这时候可以继续往下推得一个式子: a i m o d x + a j m o d x = x a i m o d x = ( x − a j m o d x ) a_i\ mod\ x\ +\ a_j\ mod\ x\ =\ x\\a_i\ mod\ x\ =\ (x\ -\ a_j\ mod\ x) ai mod x + aj mod x = xai mod x = (x  aj mod x)

如果取0的话,也可以继续推得一个式子: a i m o d x + a j m o d x = 0 a i m o d x = ( − a j m o d x ) a_i\ mod\ x\ +\ a_j\ mod\ x\ =\ 0\\a_i\ mod\ x\ =\ (-a_j\ mod\ x) ai mod x + aj mod x = 0ai mod x = (aj mod x)
这里会取到负数,根据题目条件不存在负数,所以我们将其转化为仅取正数: a i m o d x = ( − a j m o d x + x ) m o d x a_i\ mod\ x\ =\ (-a_j\ mod\ x\ +\ x)\ mod\ x ai mod x = (aj mod x + x) mod x

那么我们可以把两个式子整合为一个: a i m o d x = ( x − a j m o d x ) m o d x a_i\ mod\ x\ =\ (x\ -\ a_j\ mod\ x)\ mod\ x ai mod x = (x  aj mod x) mod x
\\

现在我们对式子 ( a i − a j ) m o d x = 0 (a_i - a_j)\ \ mod \ \ x = 0 (aiaj)  mod  x=0 进行推导。
往下化一步这个式子,可以得到: ( a i m o d y − a j m o d y ) m o d y = 0 (a_i\ mod\ y\ -\ a_j\ mod\ y)\ mod\ y\ =\ 0 (ai mod y  aj mod y) mod y = 0
在这里 a i m o d y a_i\ mod\ y ai mod y a j m o d y a_j\ mod\ y aj mod y 的取值范围是 [ 0 , y ) [0,y) [0,y) ,括号里的值应该满足是y的倍数或者是0才能够使等式成立,但是这里括号里的式子是两项相减,所以是不可能到达y的,所以取不到y的倍数,那么就只有取0。

在取0的时候,可以得到式子: a i m o d y = a j m o d y a_i\ mod\ y\ =\ a_j\ mod\ y ai mod y = aj mod y

推导到此就结束了,可以整合一下所有需要满足的条件:
{ a i m o d x = ( x − a j m o d x ) m o d x a i m o d y = a j m o d y i < j \begin{cases} a_i\ mod\ x\ =\ (x\ -\ a_j\ mod\ x)\ mod\ x\\a_i\ mod\ y\ =\ a_j\ mod\ y\\i <j \end{cases} ai mod x = (x  aj mod x) mod xai mod y = aj mod yi<j

所以我们需要找的是满足以上三个条件的数对。

那么我们只需要 O ( N ) O(N) O(N) 从前往后扫一遍,并且维护记录 a i m o d x a_i\ mod\ x ai mod x a j m o d y a_j\ mod\ y aj mod y 的出现次数。

CODE:

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
#define pii pair<int,int>void solve(){int n,x,y;cin >> n >> x >> y;map<pii,int>cnt;vector<int>a(n+1);for(int i = 1;i <= n;i++)cin >> a[i];long long res = 0;for(int i = 1;i <= n;i++){long long aa = (x - a[i]%x)%x,bb = a[i]%y;  //对于jres += cnt[{aa,bb}];cnt[{a[i] % x,a[i]%y}]++;   //当前的数据是对于之后的i}cout << res << endl;
}int main(){int T;cin >> T;while(T--){solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/12053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息系统安全与对抗-计算机木马、Web网站攻击技术、网络防火墙(期末复习简答题)

目录 七、计算机木马 1、计算机木马与计算机病毒之间存在的相同点和不同点 3、黑客利用远程控制型木马进行网络入侵的六个步骤 十一、Web 网站攻击技术 2、SQL 注入攻击漏洞的探测方法 3、防范 SQL 注入攻击的措施 5、反射型 XSS、存储型 XSS、DOM 型 XSS 的区别 6、判断…

Arthas使用使用方法

一、Arthas简介 可以用来快速定位java程序使用中的问题&#xff0c;查看程序运行过程中的各种信息。 相对于之前jvm命令方式的定位方式&#xff0c;主要有以下特性: 1) 对源程序无侵入性&#xff0c;不需要重启或修改源码 2) 交互式命令行操作方式&#xff0c;方便使用 3)…

软件测试之【软件测试初级工程师技能点全解】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;初级测试工程师技能点&#x1f449;测试理论基…

Shell脚本之数组

数组 数组中可以存放多个值&#xff08;bash 只支持一维数组&#xff09;数组元素的索引从0开始数组在括号内指定数组的值&#xff0c;每个值仅能用空格分割 其中&#xff1a;30为索引0 20为索引1 10为索引2 60为索引3 以此类推&#xff0c;不过注意索引是从0开始的 如果数组中…

vue布局设置——使用 el-drawer 打造个性化 Admin 后台布局设置

在前端开发中&#xff0c;我们常常需要为 admin 后台构建灵活且个性化的布局设置。今天&#xff0c;我要分享的是如何利用 el-drawer 来实现这样一个有趣的功能。 首先&#xff0c;我们来看一下主要的设置参数&#xff1a; 1. theme: 用于定义主题&#xff0c;可以根据需求切换…

【已解决】attributeerror: ‘FreeTypeFont‘ object has no attribute ‘getsize‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

ctfshow web入门 phpCVE web312web314

web311 web312 IMAP协议&#xff08;因特网消息访问协议&#xff09;它的主要作用是邮件客户端可以通过这种协议从邮件服务器上获取邮件的信息&#xff0c;下载邮件等。它运行在TCP/IP协议之上&#xff0c;使用的端口是143&#xff0c;在php中调用的是imap_open函数来实现功能…

学习java

在实验室看见这本书&#xff0c;无聊看了下&#xff0c;写出了第一个java代码 成功下载了eclipse并且汉化。 写了自己的第一个java程序&#xff1a; package ttttt;public class ttttt {public static void main(String[] args) {System.out.println("hello world")…

Unreal自定义字体中,缺少字怎么办,有没有字表?

关键词&#xff1a;自定义字体&#xff0c;字表&#xff0c;编码&#xff0c;UTF-8,4E00-9FFF,4E00-9FA5,字符查重&#xff0c;字符唯一&#xff0c; 问题&#xff1a; 游戏中经常要自定义字体&#xff0c; 自定义字体往往要做离线字库 offline fonts 离线字库 离不开字符表。…

6 使用 AspectJ 的 AOP 配置管理事务

1. 概述 AspectJ 主要是使用 XML 配置顾问方式自动为每个符合切入点表达式的类生成事务代理。创建测试操作步骤如下&#xff1a; 2. 创建测试项目 创建一个名为 aspectj-aop 项目&#xff0c;pom.xml 文件如下&#xff1a; <?xml version"1.0" encoding"…

调味品企业的销量增长秘诀:五丰黎红引领大厨革新之路

随着时代的发展和消费升级&#xff0c;调味品行业的竞争愈发激烈&#xff0c;在此大环境之下&#xff0c;企业需要不断寻找创新的突破点来实现销量的增长。众所周知&#xff0c;调味品行业的销售渠道主要有餐饮、家庭消费和食品加工&#xff0c;按销售额的占比约为6&#xff1a…

[JAVASE] 类和对象(二)(续篇)

目录 一. static 修饰成员方法 1.1 基本使用 1.2 注意事项 (重点) 1.2.1 1.2.1 二. 代码块 2.1 代码块的分类及使用 2.1.1 静态代码块 2.1.2 实例代码块 2.1.3 普通代码块 2.2 代码块的执行顺序 三. 对象的打印 3.1 打印对象的引用 3.2 重写 toString 方法 四. 总结 一…

idea上如何新建git分支

当前项目在dev分支&#xff0c;如果想在新分支上开发代码&#xff0c;如何新建一个分支呢&#xff1f;5秒搞定~ 1、工具类选择git&#xff0c;点击New Branch 或者右下角点击git分支&#xff0c;再点击New Branch 2、在弹出的Create New Branch弹窗中&#xff0c;输入你的新分支…

el-table组件选中后使用toggleRowSelection无法取消已选中的数据——bug记录-骚操作解决

先说本文重点解决的问题&#xff1a; 存在的问题&#xff1a;当右侧已选中的数据中&#xff0c;删除了左侧其他页面的数据&#xff0c;但是左侧数据切换到其他页面后&#xff0c;左侧还保留选中的状态。 最近在写后台管理系统的时候&#xff0c;遇到一个需求&#xff1a; 左…

linux性能监控之lsof

lsof&#xff1a;list open files&#xff0c;显示所有打开的文件以及进程信息&#xff0c;我们通常用来检查特定的文件被哪些进程打开 [rootk8s-master ~]# lsof --help lsof: illegal option character: - lsof: -e not followed by a file system path: "lp" lso…

网络工程师----第二十七天

计算机基 第四章&#xff1a;网络层 网络层提供服务的特点&#xff1a;网络层向上只提供简单的、无连接的、尽最大努力交付的数据报服务&#xff0c;不保证可靠通信。 网际协议IP&#xff1a; *地址解析协议ARP(Address Resolution Protocol) *网际控制报文协议ICMP(Inter…

JAVA学习-练习试用Java实现爬楼梯

问题: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2 输出&#xff1a; 2 解释&#xff1a; 有两种方法可以爬到楼…

长图拼接技巧大揭秘:轻松实现横向拼接,一键批量处理方法

在数字化时代&#xff0c;我们经常会遇到需要将多张图片拼接成一张长图的情况&#xff0c;无论是用于制作海报、展示报告&#xff0c;还是制作社交媒体上的长图故事&#xff0c;掌握长图拼接的技巧都显得尤为重要。本文将为大家揭秘长图拼接的实用技巧&#xff0c;并介绍办公提…

React脚手架,配置环境变量(生产模式,开发模式)

项目搭建方式&#xff1a;react脚手架(create-react-app) 1. 下载依赖&#xff1a; npm install dotenv npm install dotenv-expandnpm install dotenv-cli -S 2.配置环境变量&#xff1a; 项目根部录下创建文件.env .env.pro .env.dev 配置package.json - scripts…

群晖 Synology DSM7 过热关机解决方法

最近已经提示我过热关机过两次了&#xff0c;这两次一次是用虚拟机&#xff0c;一次是批量使用Synology Photos批量上传照片&#xff1a; 但是我没有对主机进行任何的位置移动以及硬件修改操作&#xff0c;散热环境没有发生变化。以前使用从来没有出现过这个问题&#xff0c;同…