[BZOJ1385][Baltic2000]Division expression
题目链接:
比较简单的思维题。
首先,无论怎么加括号,\(x_1\)在分子上,\(x_2\)一定在分母的位置,这很显然。
对于其他数,一定可以通过加括号转移到分子上。
(具体就是先处理\(x_2\sim x_n\),再用\(x_1\)去除使分数倒转。)
如\(x_1/(x_2/\cdots/x_n)=x_1/\frac{x_2}{\prod_{x=3}^nx_i}=\frac{\prod_{x\not=2}\limits x_i}{x_2}\)
那么只需判断\(\prod_{x\not=2}\limits x_i\)是否整除\(x_2\)即可。
一开始往分解质因数的方向去想了。。其实只要对每个\(x_i(i\not=2)\)和\(x_2\)找\(GCD\)约去即可,最后判断是否剩\(1\)。
时间复杂度 \(O(Dnlog_2x)\)
#include <cstdio>
int Gcd(int a,int b){return b?Gcd(b,a%b):a;}
int t,n,x[10005];
int main()
{
for(scanf("%d",&t);t--;)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&x[i]);
for(int i=1;i<=n;++i)
if(i!=2)x[2]/=Gcd(x[2],x[i]);
puts(x[2]==1?"YES":"NO");
}
return 0;
}