P2651 添加括号III 题解

或许是我太蒟了,想了好久的解法。

此题很明确,我们需要加上若干括号使得最后结果为整数。

明显的,我们在日常的数学计算中,可以发现:设任意分数 xyx , y 均为正整数),如果 gcd(x,y)=y ,那么 xy=x ,也就是 xy 为整数,即 x , y 可以约分。

这句话是解题的关键。理解这句话之后,我们只需要了解哪些数是分子,哪些数是分母即可判断。

分析可得, a1 只能是分子, a2 只能是分母,剩余的数可以是分子,也可以是分母。(证明见文末)

为了尽可能使 a2 被约分,最优解法就是:将剩余的数和 a1 全部处于分子处,分母处只留 a2

这样,我们只需要判断约分之后 a2是否为1。

如何约分呢?将分子的数不断与 a2 求最大公约数(设为 z ),那么 a2 与这个数就能约去 z ,令 a2a2z,就可以实现最大化约分。

思路分析完毕。代码实现如下:

#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;
}

关于前文的证明(有点粗略,请见谅):

首先,设存在 长度为 n 的序列 b1,b2,...,bn ,令 r=b1/b2/b3/.../bn ,那么根据 abc=a×cb ,可以得到如下结论:

  1. 如果 n 是偶数,r=b1×b3×...×bn1b2×b4×...×bn
  2. 如果 n 是奇数,r=b1×b3×...×bnb2×b4×...×bn1

所以对于这个序列中的 bi (1in),如果 i 是奇数, bi 处于分子处,如果 i 是偶数, bi 处于分母处。

对于这道题中的 a 序列,我们虽然可以通过添加括号,使得 ai (3in)的位置改变,位于分母还是分子具有不确定性,但是无论如何, a1 永远是第 1 位, a2 永远是第 2 位,那么 a1 只能处于分子处, a2 只能处于分母处。

posted @   Plozia  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示