题目描述
现在给出一个表达式,形如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
通过一些位置括号的尝试,我们发现,a1肯定是做分子的,a2肯定是做分母的,所以我们只需要分子尽量够大即可,于是把其他的的ai都放到分子上去(显然可以),
然后在判断一下分子除分母是不是整数即可。
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #define ll long long #define il inline #define db double using namespace std; il int gi() { int x=0,y=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') y=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*y; } int a[100045]; int main() { int T=gi(); for(int i=1;i<=T;i++) { int n=gi(); for(int i=1;i<=n;i++) a[i]=gi(); ll x=a[1],y=a[2]; for(int i=3;i<=n;i++) x=x*a[i]%y; if(x%y==0) printf("Yes "); else printf("No "); } return 0; }