CF1016G Appropriate Team

news/2025/9/21 21:28:39/文章来源:https://www.cnblogs.com/Avis-D/p/19104208

首先一个结论是:只有在 \(Y \bmod X =0\) 时,才有答案。

证明显然,因为 \(\gcd\)\(\operatorname{lcm}\) 的性质,\(a_i\)\(v\)\(X\) 的倍数,\(a_j\)\(v\)\(Y\) 的因数。

那么接下来,因为 \(X\)\(Y\) 是固定的,容易想到将它们分解质因数。

分解质因数你可以使用 Pollard's Rho 算法,但其实有个更简单的做法,我们待会儿介绍。

现在设 \(X=p_1^{cntx_1}p_2^{cntx_2}...p_k^{cntx_k}\)\(Y=p_1^{cnty_1}p_2^{cnty_2}...p_k^{cnty_k}\),把质因数集合定为 \(Y\) 的质因数集合,如果 \(X\) 没有某个质因数 \(p_i\)\(cntx_i=0\)

接着把所有 \(a_i\)\(v\) 也分解成这个形式,\(a_i=p_1^{cnt_{i,1}}p_2^{cnt_{i,2}}...p_k^{cnt_{i,k}}\)\(v=p_1^{cntv_1}p_2^{cntv_2}...p_k^{cntv_k}\)

那么 \(\gcd\)\(\operatorname{lcm}\) 的限制就可以转化为,对于 \(1\le s\le k\)\(\min(cnt_{i,s},cntv_s)=cntx_s\)\(\max(cnt_{j,s},cntv_s)=cnty_s\)

如果 \(cntx_s=cnty_s\) 的话,显然 \(v\) 必须恰好有 \(cntx_s\)\(p_s\),因为 \(a_i\)\(X\) 的倍数,\(a_j\)\(Y\) 的因数,所以 \(cnt_{i,s}\ge cntx_s\)\(cnt_{j,s}\le cnty_s\),那么一定能够满足限制,所以可以无视这一位,把它删掉了。

如果 \(cntx_s < cnty_s\) 的话,我们分类讨论,发现只有一种情况是不合法的:\(cnt_{i,s}> cntx_s\)\(cnt_{j,s}< cnty_s\),这时候 \(cntv_s\) 既要等于 \(cntx_s\),又要等于 \(cnty_s\),于是就矛盾了。

这时候问题可以转到我们熟悉的二进制上去!设 \(minn_x\) 表示所有是 \(X\) 倍数的 \(a_i\) 对于每个 \(s\),若 \(cnt_{i,s}> cntx_s\) 则第 \(s\) 位为 \(1\),否则为 \(0\),最后的二进制总和为 \(x\) 的有几个。类似地,设 \(maxn_x\) 表示所有是 \(Y\) 因数的 \(a_i\) 对于每个 \(s\),若 \(cnt_{i,s}< cnty_s\) 则第 \(s\) 位为 \(1\),否则为 \(0\),最后的二进制总和为 \(x\) 的有几个。

于是最后的答案就为 \(\sum minn_imaxn_j \,[\,i\&j =0\,]\)

最后就是,怎么对 \(Y\) 分解质因数。题解给出了一个非常巧妙的做法:先把 \(1\sim 10^6\) 的质数筛出来,把 \(Y\) 在这之间的质因数去掉。那么剩下的数 \(s\) 要么是一个大质数,要么是一个大质数的平方,要么是两个不同的大质数的乘积。是不是一个大质数的平方很容易用 \(\operatorname{sqrtl}\) 判断。接下来,判断 \(s\) 是否等于 \(p\times q\),你发现如果不存在一个 \(a_i\)\(p\) 的倍数但不是 \(q\) 的倍数或是 \(q\) 的倍数但不是 \(p\) 的倍数,那么所有的 \(a_i\) 要么都没有 \(p\)\(q\) 两个因子,要么都有这两个因子,那么我们可以把 \(p\times q\) 看成一个因子,这对答案不会有影响。所以判断 \(s\) 是否等于 \(p\times q\),只要将 \(s\) 和所有 \(a_i\) 取个 \(\gcd\),若 \(\gcd\) 不等于 \(1\) 也不等于 \(s\),说明找到了 \(p\)\(q\) 中的一个,就做完了。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10,M=1e6+10;
int n,m,x,y,s,ans,a[N],minn[(1<<15)+10],maxn[(1<<15)+10];
int tot,vis[M],pr[M],p[16],cntx[16],cnty[16];
void find()
{for(int i=1,g;i<=n;i++){g=__gcd(a[i],s);if(g!=1&&g!=s){p[++m]=g,cnty[m]=1;p[++m]=s/g,cnty[m]=1;return;}}p[++m]=s,cnty[m]=1;return;
}
signed main()
{for(int i=2;i<=M-10;i++){if(!vis[i])pr[++tot]=i;for(int j=1;j<=tot&&pr[j]*i<=M-10;j++){vis[pr[j]*i]=1;if(i%pr[j]==0)break;}}scanf("%lld%lld%lld",&n,&x,&y),s=y;for(int i=1;i<=n;i++)scanf("%lld",&a[i]);if(y%x)printf("0");else{for(int i=1;i<=tot;i++){if(s%pr[i]==0){p[++m]=pr[i];while(s%pr[i]==0)s/=pr[i],cnty[m]++;}}if(s>1){int sq=sqrtl(s);if(sq*sq==s)p[++m]=sq,cnty[m]=2;else find();}for(int i=1,s=x,j=0;i<=m;i++){while(s%p[i]==0)cntx[i]++,s/=p[i];if(cntx[i]!=cnty[i])p[++j]=p[i],cntx[j]=cntx[i],cnty[j]=cnty[i];if(i==m)m=j;}for(int i=1,sum;i<=n;i++){if(a[i]%x)continue;sum=0;for(int j=1,s=a[i],cnt;j<=m;j++){cnt=0;while(s%p[j]==0)cnt++,s/=p[j];if(cnt>cntx[j])sum+=(1<<(j-1));}minn[sum]++;}for(int i=1,sum;i<=n;i++){if(y%a[i])continue;sum=0;for(int j=1,s=a[i],cnt;j<=m;j++){cnt=0;while(s%p[j]==0)cnt++,s/=p[j];if(cnt<cnty[j])sum+=(1<<(j-1));}maxn[sum]++;}for(int i=0;i<m;i++)for(int j=0;j<(1<<m);j++)if((j>>i)&1)maxn[j]+=maxn[j-(1<<i)];for(int i=0;i<(1<<m);i++)ans+=minn[i]*maxn[(1<<m)-1-i];printf("%lld\n",ans);}return 0;
}

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

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

相关文章

CF494C Helping People

CF494C Helping People 看到保证区间不会交错,没想出来这个性质是干什么的,看了题解才知道,这说明区间之间只会互相包含。 那么我们就可以为每个区间指定一个 \(fa\) 区间来代表最小的包含它的区间,不难发现这构成…

深入解析:Extract Chart Data Directly to Excel

深入解析:Extract Chart Data Directly to Excelpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

AOSP Android12 Source 下载同步

获取Repo工具并配置镜像地址 curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo chmod a+x ~/bin/repo export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/初始化仓库并指定…

02020404 EF Core基础04-自增主键、Guid主键、混合自增、Hi/Lo算法、Migration深入、数据库其它迁移命令

02020404 EF Core基础04-自增主键、Guid主键、混合自增、Hi/Lo算法、Migration深入、数据库其它迁移命令 1. 主键无小事(视频3-6) 1.1 自增主键 1、EF Core支持多种主键生成策略:自动增长;Guid;Hi/Lo算法等。 2、…

02020403 EF Core基础03-Fluent API、Data Annotation、两种配置的选择

02020403 EF Core基础03-Fluent API、Data Annotation、两种配置的选择 1. FluentAPI哪些不该用(视频3-4) 1.1 约定配置 主要规则: 1:表名采用DbContext中的对应的DbSet的属性名。 2:数据表列的名字采用实体类属性…

深入解析:Python(1)|| 超基础语法(格式,输入输出,变量,字符串,运算符)

深入解析:Python(1)|| 超基础语法(格式,输入输出,变量,字符串,运算符)2025-09-21 21:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflo…

深入解析:STM32-FreeRTOS操作系统-任务管理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Java中异步任务的执行方式有几种?

在Java中,异步任务的执行方式有多种,每种方式适用于不同的场景和需求。以下是常见的几种实现方式:Thread类 最基础的方式是直接使用Thread类创建线程执行任务:new Thread(() -> {// 异步执行的任务System.out.p…

mysql数据库自增ID为int类型超过范围

mysql数据库自增ID为int类型超过范围mysql数据的自增加的id(int)类型,超过范围:数据自增加ID,为int类型,超过范围,就插入数据库失败;怎么解决? 由于数据比较大, 1.第一个简单粗暴:把int变为(BIGINT)不用迁…

202508_浙江省网络安全测试职业职工技能竞赛_misc-1

流量分析,RE,XORTags:流量分析,RE,XOR 0x00. 题目 你是一名资深的网络安全分析取证师,受命调查一家IT公司近期遭遇的一起严重网络安全事件。 该公司主要业务是为中小型企业提供定制化管理系统和数据分析服务。 由…

python爬虫测试

python爬虫测试0.背景:要下合适自己的驱动,不然都是报错!!你需要完成以下两步:检查你的 Chrome 浏览器版本。打开 Chrome,在地址栏输入 chrome://settings/help。 你会看到你的 Chrome 版本号,例如 版本 120.0.…

广二联考题解补全计划:

第十七套: T1:取模性质,倍增 T2: DP优化,状态优化 T3:容斥原理,数位DP T1: 首先先提一个关于取模的性质,一个数对一个比它小的数取模,大小一定减半,考虑对 $ \frac {n}{2}$ 分治即可。 我们先预处理出来每个数…

如何在 C# 中将文本转换为 Word 以及将 Word 转换为文本 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Chapter 8 Contour / Shape Detection

def getContours(img):contours, hierarchy = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)for cnt in contours:area = cv2.contourArea(cnt)print(area)if area > 500:# -1 代表所有的轮廓c…

【左程云算法笔记016】双端队列-双链表和固定数组实现 - 教程

【左程云算法笔记016】双端队列-双链表和固定数组实现 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

LeetCode 几道 Promises 和 Time 的题目 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[硬件电路-232]:FET(场效应管)的核心机制是通过栅极电压调控半导体“沟道“中的载流子浓度与分布,进而控制源极与漏极之间的电流大小 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

java相关问题:面向对象入门2与类的识别

1. 关于 static 修饰符 应该用 static 修饰的方法: *不依赖于特定对象的实例状态:执行的操作不访问或修改对象的实例变量。 *工具类方法:常用于定义工具类中的方法,这些方法提供通用功能,无需创建类实例。 *工厂方…

EXCEL自动调整列宽的快捷键

在 Excel 中,自动调整列宽的快捷键是:Windows 系统:先选中要调整的列(可选中单列或多列),然后按下 Alt + H + O + I(依次按下这些键)。 Mac 系统:先选中要调整的列,然后按下 Command + Option + H + O + I。…

【C++实战⑬】解锁C++文件操作:从基础到实战的进阶之路 - 实践

【C++实战⑬】解锁C++文件操作:从基础到实战的进阶之路 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…