题目描述
现在给出一个表达式,形如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\n");
else
printf("No\n");
}
return 0;
}