Description
阿里巴巴又一次来到了灯神藏身的山洞,洞口一如既往地被一个巨大的石门关着。但是无论阿里巴巴怎样大喊“芝麻开门”,石门都纹丝不动。原来由于阿里巴巴不断地求灯神办事儿,灯神觉得烦了,于是灯神对石门施了魔法,使石门换了一种打开方式。灯神在石门上写了一个数学表达式:
X1/X2/X3/X4……/XN (/表示除号)
并在下面写了几行提示:
添加适当的括号,当表达式的值为整数时,大门将为你敞开。
阿里巴巴自觉能力不足,于是找来了你帮他打开这道石门,你能做到吗?
Input
测试数据有多组,对于每组数据,第一行为一个整数N(1<=n<=10000),表示表达式中数字的个数,其后的第i+1行每行有一个整数表示Xi的值(1<=i<=N)。(1<=Xi<=1000000000)
Output
对于每组数据,如果你能帮阿里巴巴打开石门,输出YES,否则输出NO。
Sample Input
58421143579
Sample Output
YESNO
这是刘汝佳黑书上面的一道例题~
关键是看x2~因为其他的数在加括号之后都可以变成分子~只有x2只能做分母~
将除了x2之外的数全变为分子~即x1/(x2/x3/......../xn)=(x1*x3/x4/......./xn)/x2~
则只要当x2能被整除消去时~整个式子结果就为整数~
则只需要从x1~x3~x4......xn~一个个与x2求最大公约数~x2约去这些数~最后x2完全消去即可~
其实这题和d题一样~稍稍改改就行~
#include"iostream"
#include"queue"
using namespace std;
long aa(long a1,long a2)
{
long b1,b2;
long c=1;
queue<long>Que;
Que.push(a1);
Que.push(a2);
while(c!=0)
{
b1=Que.front();
Que.pop();
b2=Que.front();
c=b1%b2;
Que.push(c);
}
return b2;
}
int main()
{
long i;
queue<long>bb;
long n;
long temp;
long a1,a2;
while(cin >> n)
{
cin >> temp;
bb.push(temp);
cin >> a1;
for(i=0;i<n-2;i++)
{
cin >> temp;
bb.push(temp);
}
while(!bb.empty())
{
a2=bb.front();
bb.pop();
a1=a1/aa(a1,a2);
}
if(a1==1)
cout <<"YES"<<endl;
else
cout <<"NO"<<endl;
}
}