除法表達式
給出一個這樣的除法表達式:X1/X2/X3/···/Xk,其中Xi是正整數。除法表達式應當按照從左到右的順序求和,例如表達式1/2/1/2的值爲1/4。但是可以在表達式中嵌入括號以改變計算順序,例如表達式(1/2)/(1/2)的值爲1
輸入
首先輸入一個N,表示有N組測試數據, 每組數據輸入佔一行,爲一個除法表達式, 輸入保證合法。
使表達式的值爲整數。k<=10000,Xi<=100000000
. 輸出 輸出YES或NO
樣例輸入
1
1/2/1/2
樣例輸出
YES
(1)思路:
不難知道整個表達式最後一定會變成這樣的形式:A/B
而A,B都可以表達爲這些數中某一部分的乘積。自然就會想到B越小越好,最好是1,這樣就可以變成整數了。
經過一些嘗試後會發現,**X2必然在B中,而其他數都可以在上,**這樣問題就簡單明瞭了
設 E=(X1X3X4X5X6…Xk)/X2 只需要判斷E是否爲整數即可!(ง •_•)ง
(2)方法
方一:
簡單粗暴直接算,算高精度乘法,然後看能否整除
方二:
使用唯一分解定理,把X2拆了,然後看看剩下所有的Xi們能不能貢獻出所需的pi對應的次數ai,這個方法很正確,但還可以更優化一點
方三:
沒錯就是直接約分,每次把X2除掉與Xi的gcd,這樣除k遍後如果X2是1那麼E就是整數啦
#include<iostream>
using namespace std;
const int N = 10010;
int a[N];
int n;
bool judege(int a[]);
int gcd(int x,int y);
int main()
{
cin>>n;
for(int i = 1;i<=n;i++)
cin>>a[i];
if(judege(a))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
return 0;
}
bool judege(int a[])
{
a[2] /= gcd(a[2],a[1]);
for(int i = 3;i<=n;i++)
{
a[2] = a[2]/(gcd(a[2],a[i]));
}
if(a[2] == 1)
return true;
return false;
}
int gcd(int x,int y)
{
if(y == 0)
return x;
return gcd(y,x%y);
}