Atcoder [ARC165A] Sum equals LCM 题解
Description
给出 \(T\) 组询问,每次询问给出一个正整数 \(n\),是否存在一个长度大于等于 \(2\) 的正整数数列 \(x_1,x_2,x_3 \dots x_k\),使得该数列满足满足以下条件:
-
\(x_1+x_2+\dots+x_k=n\)
-
\(\operatorname{lcm}(x_1,x_2,x_3,\dots x_n)=n\)
-
数列中的元素可以重复,也可以不重复
如果存在,输出 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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App