P2651 添加括号III
题目描述
现在给出一个表达式,形如a1/a2/a3/.../an
如果直接计算,就是一个个除过去,比如1/2/1/4=1/8。
然而小A看到一个分数感觉很不舒服,希望通过添加一些括号使其变成一个整数。一种可行的办法是(1/2)/(1/4)=2。
现在给出这个表达式,求问是否可以通过添加一些括号改变运算顺序使其成为一个整数。
输入输出格式
输入格式:
一个测试点中会有多个表达式。
第一行t,表示表达式数量。
对于每个表达式,第一行是n,第二行n个数,第i个数表示ai。
输出格式:
输出t行。
对于每个表达式,如果可以通过添加括号改变顺序使其变成整数,那么输出“Yes”,否则输出“No”
输入输出样例
说明
对于40%的数据,n<=16
对于70%的数据,n<=100
对于全部数据,2<=n<=10000,1<=t<=100,1<=ai<=maxlongint
//Pro: P2651 添加括号III //紫书习题 //设序列为x1,x2,x3...xn //可以知道,x2必须在分母上,其他的都可以在分子上,也就变成了x2可不可以被x1*x3*x4*...*xn整除的问题 //用gcd约分,如果x2==1了,那么就能是整数 //否则就不行 #include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int N=1e4+5; int T,n; int x[N]; int prime[N],cnt; int gcd(int a,int b) { int c; while(b) { c=b; b=a%b; a=c; } return a; } int main() { scanf("%d",&T); do { bool flag=0; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d",x+i); x[2]/=gcd(x[1],x[2]); for(int i=3;i<=n;++i) { x[2]/=gcd(x[2],x[i]); if(x[2]==1) { flag=1; break; } } if(flag) puts("Yes"); else puts("No"); }while(--T); return 0; }