明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。
這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是可以用計算機來解決這個問題。假設你是明明,能完成這個任務嗎?
這個選擇題中的每個表示式都滿足下面的性質:
1. 表示式只可能包含乙個變數『a』。
2. 表示式中出現的數都是正整數,而且都小於10000。
3. 表示式中可以包括四種運算『+』(加),『-』(減),『*』(乘),『^』(乘冪),以及小括號『(』,『)』。小括號的優先順序最高,其次是『^』,然後是『*』,最後是『+』和『-』。『+』和『-』的優先順序是相同的。相同優先順序的運算從左到右進行。(注意:運算子『+』,『-』,『*』,『^』以及小括號『(』,『)』都是英文本元)
4. 冪指數只可能是1到10之間的正整數(包括1和10)。
5. 表示式內部,頭部或者尾部都可能有一些多餘的空格。
下面是一些合理的表示式的例子:
((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9……
對於30%的資料,表示式中只可能出現兩種運算子『+』和『-』;
對於其它的資料,四種運算子『+』,『-』,『*』,『^』在表示式中都可能出現。
對於全部的資料,表示式中都可能出現小括號『(』和『)』。
輸入的第一行給出的是題幹中的表示式。第二行是乙個整數n(2 <= n <= 26),表示選項的個數。後面n行,每行包括乙個選項中的表示式。這n個選項的標號分別是a,b,c,d……
輸入中的表示式的長度都不超過50個字元,而且保證選項中總有表示式和題幹中的表示式是等價的。
輸出包括一行,這一行包括一系列選項的標號,表示哪些選項是和題幹中的表示式等價的。選項的標號按照字母順序排列,而且之間沒有空格。
( a + 1) ^23(a-1)^2+4*a
a + 1+ a
a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a
1sac
noip2005 第四題
題解:關於a的表示式??這麼複雜的式子判斷是否相等,難道我要合併同類項?nonono
~機智的方法:給a代入特殊值。不要代入0,
1,-1這樣的數。最好代質數。
只代入乙個數還是很有可能出現兩個不等的式子算出來結果相等。
多代幾個數
還有乙個問題,代數的話,計算結果可能會超過
long
long
範圍。計算的時候記得模乙個大質數。因為我們取了若干個數代進去,所以即使模了乙個數衝突的機率也很小
下面進入正題:如何計算表示式的值?
我們需要開兩個棧:乙個用來儲存數字,乙個用來儲存符號。
讀入數字時,壓入數字棧
讀入符號時:
1.如果是運算子,當前棧頂的運算子優先順序大於等於新運算子,則將棧頂運算子彈出,並將當前數字棧頂的兩個數進行相應運算,彈出舊數,壓入新結果。不停迴圈,直到棧裡面沒有符號或符號優先順序低於當前新運算子。
2.如果是(,直接壓入棧。
3.如果是),則依次將棧裡面的符號彈出,並計算。直到遇到乙個(。
注意讀入的細節,還有,洛谷的輸入資料括號不匹配,需要手動處理一下,防止死迴圈。
#include using namespace std;
typedef long long ll;
const int mod = 20000801;
char ch[60][500];
int map1[500];
struct stack1
void push(ll x)
void pop()
ll top()
};stack1 sk1;
stack1 sk2;
ll pow1(ll x, ll y)
void algo()
int cacl(char * ch1, int num1)
if(c >= '0' && c <= '9')else if(ok)
if(c == '\0') break;
if(map1[c] != 0)else if(p == 2)
sk2.pop();
}else}}
while(!sk2.empty()) algo();
return sk1.top();
}int main()}}
ll num1 = cacl(ch[0], 3);
ll num2 = cacl(ch[0], 7);
for(int i = 1; i <= n; i ++)
return 0;
}
洛谷P1052 NOIP2005 過河
此題srz大神評價為玄學題 座標離散化 特判 1 當s t時,由於橋很長而石頭很少,所以青蛙跳很久才會跳到乙個點,由於s t,所以青蛙跳j的距離的方案數為 j t s 種,可以認為青蛙一定有一種方案能跳過這個石頭 事實上,當兩塊石頭之間的距離 lcm s,t 時,青蛙就可以隨便跳了,所以可以將每個石...
洛谷 P1054 等價表示式
題目描述 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是...
洛谷P1054等價表示式題解 zhengjun
題目描述 明明進了中學之後,學到了代數表示式。有一天,他碰到乙個很麻煩的選擇題。這個題目的題幹中首先給出了乙個代數表示式,然後列出了若干選項,每個選項也是乙個代數表示式,題目的要求是判斷選項中哪些代數表示式是和題幹中的表示式等價的。這個題目手算很麻煩,因為明明對計算機程式設計很感興趣,所以他想是不是...