NYOJ_1013除法表达式
生活随笔
收集整理的這篇文章主要介紹了
NYOJ_1013除法表达式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大體描述:
給出一個除法表達式:X1/X2/X3/…/Xk,其中Xi為正整數。除法表達式應當按照從左到右的順序求和,例如,表達式1/2/1/2的值為1/4。但是可以在表達式中嵌入括號改變計算順序,例如,表達式(1/2)/(1/2)的值為1.
輸入X1,X2…,Xk,判斷是否可以通過添加括號,使表達式的值為整數。K<=10000,Xi<=10^9;
可以分析出來我們只需要判斷X1*X3…Xk/X2是否為整數即可。
一:高精度運算,
?? 由題目所給的范圍可以知道,必須利用高精度才能存儲X1…Xk的乘積,所以只需要用高精度運算進行K-2次乘法和1次除法即可。
?? 此方法有點麻煩,只做分析
二:唯一分解定理
?? 分析:由唯一分解定理,X2=P1^A1*P2^A2…P2*An,(其中Pi為質數)
?? 所以利用唯一分解定理,我們就只需要依次判斷Pi的指數Ai是否不大于X1*X3…Xk里面Pi的指數ai即可。
?? 給出AC代碼如下:
?
#include <iostream> #include <cstring> #include <stdio.h> using namespace std; int item[10005]; int nums[100][2];//long long 類型的數據分解為質數相乘不超過16位 int ptot[100];void solve(int num1) {memset(ptot,0,sizeof(ptot));int num2=nums[0][0];int i,j;for(i=1;i<=num2;i++){int p=nums[i][0];for(j=1;j<=num1;j++){int q=item[j];if(j==2) continue;while(q%p==0){q/=p;ptot[i]++;}}if(ptot[i]<nums[i][1]){cout<<"NO"<<endl; return;}}cout<<"YES"<<endl;} void depart(int m)//分解m{int&num = nums[0][0]=0;//nums[0][0]是表頭,存放總的個數,用引用比較方便num = 0;for (int i = 2; i*i <= m;i++)if (m%i == 0){nums[++num][0] = i;nums[num][1] = 0;do{nums[num][1]++;m /= i;} while (m%i == 0);//將i除干凈}if (m > 1)//如果分解到最后m仍然大于1,說明它是一個素數。注意:如果只是判斷素因子有哪些,可以沒有此處判斷,否則必須有此步{nums[++num][0] = m;nums[num][1] = 1;}} int main() {int n;cin>>n;while(n--){char c;int i;for(i=1;;i++)//輸入除法表達式{scanf("%d",&item[i]);c=getchar();if(c=='\n') break;}if(i==1) cout<<"YES"<<endl;else{depart(item[2]);solve(i);}}return 0; }
三:歐幾里得算法
分析:我們可以直接約分,依次將X1,X3,…Xk與X2約去它們的最大公約數,如果最后X2為1,則說明可以,反之不行
給出AC代碼:
??
#include <iostream> #include <stdio.h> using namespace std; const int K=10005; int num[K];int gcd(int a, int b){return b==0?a:gcd(b,a%b); } bool solve(int s) {num[2]/=gcd(num[1],num[2]);if(num[2]==1) return true;for(int i=3;i<=s;i++){num[2]/=gcd(num[2],num[i]);if(num[2]==1) return true;}return false; }int main() {int n;cin>>n;while(n--){char c;int i;for(i=1;;i++)//除法表達式的輸入{scanf("%d",&num[i]);c=getchar();if(c=='\n') break;}if(i==1) cout<<"YES"<<endl;else {if(solve(i)) cout<<"YES"<<endl;else cout<<"NO"<<endl;}}return 0; }注:以上方法參考劉汝佳老師的《算法競賽入門經典》,
總結
以上是生活随笔為你收集整理的NYOJ_1013除法表达式的全部內容,希望文章能夠幫你解決所遇到的問題。