首页 > 其他分享 >ABC191F 题解

ABC191F 题解

时间:2023-05-09 17:45:02浏览次数:47  
标签:gcd puts int 题解 ABC191F mp text define

题目传送门

题目分析

我们发现,\(\text{min}\) 操作实际上就是把两数当中较大的那个删除,较小的那个数不受影响,所以用最小的数删还是用另一个数删是无区别的。

一个性质:

\[\gcd(x,y) \le \min(x,y) \]

不管 \(a_{min}\) 是原来的还是在 \(\text{gcd}\) 操作后新生成的,所以无论什么时候删,该删的数都能删掉。

问题简化为:取一些数的 \(\text{gcd}\),然后用最小的数删,删到只剩一个 \(\text{gcd}\)。

所以我们只需要求去除子集最大公因数的个数即可。那么对于每个 \(a_i\) 都分解因数,对于每个因数,记录有哪些 \(a_i\) 包含它。然后再遍历一遍,比对此因数是否与其对应的 \(a_i\) 最大公因数相等即可。

贴上代码

#include<bits/stdc++.h>
// #define int long long
#define debug puts("Shiina_Mashiro_kawaii")
#define ok puts("YES")
#define no puts("NO")
#define inf 1e9
using namespace std;
int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-48;
		c=getchar();
	}
	return x*f;
}
const int maxn=2010;
int n;
int ans;
int a[maxn];
map<int,int> mp;
inline void init(){
	n=read();
	for(register int i=1;i<=n;++i) a[i]=read();
	sort(a+1,a+n+1);
}
int main(){
	init();
	for(register int i=1;i<=n;++i){
		for(register int j=1;j<=sqrt(a[i]);++j){
			if(a[i]%j==0){
				if(j<=a[1]) mp[j]=__gcd(mp[j],a[i]);
				if(a[i]/j<=a[1]) mp[a[i]/j]=__gcd(mp[a[i]/j],a[i]); 
			}
		}
	}
	map<int,int>::iterator it;
	for(it=mp.begin();it!=mp.end();++it){
		if(it->first==it->second) ans++;
	}
	printf("%d\n",ans);
}

标签:gcd,puts,int,题解,ABC191F,mp,text,define
From: https://www.cnblogs.com/yizhixiaoyun/p/17385793.html

相关文章

  • ant-select数据会发生卡顿问题解决
    <a-selectv-model="form.region"show-searchplaceholder="请选择"option-filter-prop="children"@search="handleSearch"@popupScroll="handlePopu......
  • [AtCoder-AT_ABC070C]题解(C++)
    PartIPreface原题目(Luogu)原题目(AtCoder)PartIISketch给定一个正整数\(N(1\leqN\leq100)\),表示时钟数量。接下来\(N\)行,每行一个正整数\(T_i(1\leqT_i\leq10^{18})\),表示每个时钟旋转\(T_i\)秒后还会回到原来的地方。求出在多少秒之后,所有时钟还会同时......
  • xshell7 免费版 关闭 弹窗问题解决
    原博客地址:https://www.hao.kim/1175.html使用二进制编辑器winhex进行编辑绿色版下载地址:https://mikemhm.lanzoul.com/i6boy0v2a6pa使用winhex打开xshell.exe文件xshell.exe默认目录"C:\ProgramFiles(x86)\NetSarang\Xshell7\Xshell.exe"查找16进制数值74116A006A0......
  • [AtCoder-AT_ABC070_A]题解(C++)
    PartIPreface原题目(Luogu)原题目(AtCoder)PartIISketch给定一个正整数\(n(100\leqn\leq999)\)。求\(n\)是否是一个回文数,是输出\(\texttt{Yes}\),不是输出\(\texttt{No}\)。PartIIIAnalysisSolve1如果仔细观察的话,应该都能发现,\(n\)一定是一个三位数。......
  • P8714 题解
    洛谷P8714题意自己看(思路分五个小题去考虑。问题A枚举门牌号,看门牌号中有多少个\(2\),统计答案即可。voidsloveA(){//问题Aintsum=0;for(inti=1,j;i<=2020;i++){//枚举门牌号j=i;while(j){//枚举每一位sum+=(j%10......
  • 第十四届蓝桥杯省赛C++ B组(个人经历 + 题解)
    参赛感受这是我第一次参加蓝桥杯的省赛,虽然没什么参赛经验,但是自己做了很多前几届蓝桥杯的题,不得不说,这一届蓝桥杯省赛的难度相较于之前而言还是比较大的。之前很流行蓝桥杯就是暴力杯的说法,但是随着参赛人数的增多,比赛认可度的提升,比赛题目的质量也明显越来越高了。这次省赛涉及......
  • CF920E Connected Components? 题解
    一道线段树优化建图好题(大雾扣掉一些边看起来不好做,我们直接大力加上存在的边,然后跑连通块。对于一个点,如果他被扣掉了\(k\)个邻居,那么没扣掉的那些形成了至多\(k+1\)个连续段,可以用线段树优化建图向每个连续段各用\(\log\)的代价连边。由于总共扣掉了\(m\)条边,所以总共......
  • 装最多水的容器 - 题解
    1.问题描述  原题的地址见:ContainerWithMostWater-LeetCode.此问题等价于如下问题:    给定所有元素非负的数组[a0,a1,...,an-1],计算(j-i)|aj-ai|(其中j>i)的最小值。 2.暴力解法  有了问题的描述,很容易写出暴力求解的算法:intmaxArea(vector<int>......
  • Windows 安装 pycrypto 常见问题解决
    关于python使用Crypto.Cipher模块,ImportError:Nomodulenamed'Crypto' 常见问题解决1. 需要安装:MicrosoftVisualC++14.0error:MicrosoftVisualC++14.0isrequired.Getitwith"MicrosoftVisualC++BuildTools":http://landinghub.visualstudio.co......
  • CF1794D 题解
    一、题目描述:一个正整数$m$可以被唯一分解成$p_1^{e_1}\timesp_2^{e_2}\times...\timesp_k^{e_k}$的形式,其中$p_1,p_2,...,p_k$为互不相同的质数,$e_1,e_2,...,e_k$为正整数。定义一个可重集$f(m)$为$\{p_1,e_1,p_2,e_2,...,p_k,e_k\}$。现在给定正整数$......