Atcoder [ARC165A] Sum equals LCM 题解

Description

给出 \(T\) 组询问,每次询问给出一个正整数 \(n\),是否存在一个长度大于等于 \(2\) 的正整数数列 \(x_1,x_2,x_3 \dots x_k\),使得该数列满足满足以下条件:

  1. \(x_1+x_2+\dots+x_k=n\)

  2. \(\operatorname{lcm}(x_1,x_2,x_3,\dots x_n)=n\)

  3. 数列中的元素可以重复,也可以不重复

如果存在,输出 Yes,否则输出 No。

其中 \(T\le100,n\le10^9\)

Solution

对于第一个条件,显然往数列后面补 \(1\) 即可使数列满足该条件。难点在于第二个条件。

我们知道,如果两个整数 \(x,y\) 满足 \(\gcd(x,y)=1\),也就是这两个整数互质,那么一定满足 \(\operatorname{lcm}(x,y)=x\times y\)。于是对于整数 \(n\),如果存在两个互质的因数 \(d_1\)\(d_2\) 使 \(d_1\times d_2=n\),将它们写入数列中,此时数列就满足第二个条件了。由于将 \(1\) 写入数列不影响整个数列的最小公倍数,因此只需要向数列后面补 \(1\) 直到数列的和等于 \(n\) 即可使数列同时满足两个条件。于是问题转化为判断 \(n\) 是否存在两个互质的因数 \(d_1\)\(d_2\) 使 \(d_1\times d_2=n\)

由唯一分解定理,我们知道 \(n\) 可以被唯一分解成 \(p_1^{a_1}p_2^{a_2}p_3^{a_3}\dots\) 的形式,其中 \(p\) 表示 \(n\) 的质因子。当 \(n\) 的质因子数量为 1 时,对于这个质因子 \(p\)\(\frac{n}{p}\)显然一定是它的倍数,两个数的最小公倍数是 \(\frac{n}{p}\),显然不满足第二个条件。但是当 \(n\) 有两个或以上质因数时,就能满足条件了。设 \(p_1\)\(p_2\)\(n\) 的两个质因数,由于 \(p_1\)\(p_2\) 互质,\(p_1^{a_1}\)\(p_2^{a_2}\) 显然也互质。它们就是两个互质的因数。如果还存在其它质因子 \(p_3,p_4\dots\) 也没关系,将它们乘到 \(p_2\) 上即可。由于质因数两两之间不存在公因数,所以 \(p_1^{a_1}\)\(p_2^{a_2}p_3^{a_3}p_4^{a_4}\dots\) 也是互质的,它们就是 \(n\) 的两个互质的因数,并且相乘等于 \(n\)

于是,只要 \(n\) 存在两个或以上质因子即可满足条件。将 \(n\) 分解质因数,如果质因数数量大于等于 2 则输出 Yes,否则输出 No。

Code

#include<bits/stdc++.h>
using namespace std;
bool div(int n)
{
	int res=0;
	for(int i=2;i<=n/i;i++)
	{
		if(n%i==0) res++;
		if(res>1) return 1;
		while(n%i==0) n/=i;
	}
	if(n>1) res++;
	if(res>1) return 1;
	return 0;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		if(div(n)) puts("Yes");
		else puts("No");
	}
	return 0;
}
posted @   __Star_Sky  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示