题目描述
现在给出一个表达式,形如a1/a2/a3/.../an
如果直接计算,就是一个个除过去,比如1/2/1/4=1/8。
然而小A看到一个分数感觉很不舒服,希望通过添加一些括号使其变成一个整数。一种可行的办法是(1/2)/(1/4)=2。
现在给出这个表达式,求问是否可以通过添加一些括号改变运算顺序使其成为一个整数。
输入输出格式
输入格式:
一个测试点中会有多个表达式。
第一行t,表示表达式数量。
对于每个表达式,第一行是n,第二行n个数,第i个数表示ai。
输出格式:
输出t行。
对于每个表达式,如果可以通过添加括号改变顺序使其变成整数,那么输出“Yes”,否则输出“No”
输入输出样例
输入样例#1:
2 4 1 2 1 4 5 6 5 7 9 12
输出样例#1:
Yes No
说明
对于40%的数据,n<=16
对于70%的数据,n<=100
对于全部数据,2<=n<=10000,1<=t<=100,1<=ai<=maxlongint
思路
a1肯定是分子,a2肯定是分母,那么尽可能多的是a3以后的变为分子,因此a1/(a2/a3/a4/...)=a1a3a4.../a2,所以我们只要确认a1a3a4.../a2是否是整数即可。可以每次约掉ai和a2的最大公约数,只有当约完后a2=1时,该表达式的值为整数。
代码
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=1e4+7;
int main()
{
int t,n,a[N];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
a[1]=a[1]/__gcd(a[0],a[1]);
for(int i=2;i<n;i++)
{
a[1]=a[1]/__gcd(a[1],a[i]);
}
if(a[1]==1)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}