P2651 添加括号III 题解
或许是我太蒟了,想了好久的解法。
此题很明确,我们需要加上若干括号使得最后结果为整数。
明显的,我们在日常的数学计算中,可以发现:设任意分数 ( , 均为正整数),如果 ,那么 ,也就是 为整数,即 , 可以约分。
这句话是解题的关键。理解这句话之后,我们只需要了解哪些数是分子,哪些数是分母即可判断。
分析可得, 只能是分子, 只能是分母,剩余的数可以是分子,也可以是分母。(证明见文末)
为了尽可能使 被约分,最优解法就是:将剩余的数和 全部处于分子处,分母处只留 。
这样,我们只需要判断约分之后 是否为1。
如何约分呢?将分子的数不断与 求最大公约数(设为 ),那么 与这个数就能约去 ,令 ,就可以实现最大化约分。
思路分析完毕。代码实现如下:
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
typedef long long LL;
int t,n;
LL a[MAXN];
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
{
if(i==2) continue;//特别注意过滤a2!!!
a[2]=a[2]/gcd(a[2],a[i]);//约分
}
if(a[2]==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
关于前文的证明(有点粗略,请见谅):
首先,设存在 长度为 的序列 ,令 ,那么根据 ,可以得到如下结论:
- 如果 是偶数,。
- 如果 是奇数,。
所以对于这个序列中的 (),如果 是奇数, 处于分子处,如果 是偶数, 处于分母处。
对于这道题中的 序列,我们虽然可以通过添加括号,使得 ()的位置改变,位于分母还是分子具有不确定性,但是无论如何, 永远是第 1 位, 永远是第 2 位,那么 只能处于分子处, 只能处于分母处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具