POJ 1186 方程的解數

2021-06-27 13:43:18 字數 1780 閱讀 6187

一道資料結構的水題。。。

題意為給予乙個最多含六個未知數的方程k1*x1^p1+k2*x2^p2+k3*x3^p3+k4*x4^p4+k5*x5^p5+k6*x6^p6=0;求其整數解的個數。

其中x1,x2.....x6均大於等於1小於等於m(m為輸入的乙個正數,最大150最小1)。而且保證過程計算小於2^31。

到這裡思路已經蠻清晰了,而且限時為15000ms。。。就是為了暴力過啊 = = (大力出奇蹟?)

直接想到的就是暴力dfs,不過150^6也是不好搞的,所以加個優化,根據係數k的正負來分類項,比如選擇負係數的項為庫,將其所有的和的絕對值存起來,然後再累加正係數項的和,在庫中進行查詢。【就是相當於把式子變為k1*x1^p1+k2*x2^p2=k3*x3^p3+k4*x4^p4+k5*x5^p5+k6*x6^p6,其中k的值均為正整數,這樣做的意義是為了降低時間複雜度,相當於左邊為o(m^2),右邊為o(m^4)。這樣的話就想到加快查詢的效率。。。用字典樹存一邊的和(二進位制形式的)。

=.=  但是這樣第乙個問題是最壞情況下時間複雜度還是o(m^5),第二個問題是字典樹空間要求太大,會超記憶體(這方法簡直夠蠢)

所以後來又重新考慮了下,直接選擇線性表存,不過不是存一邊的和,而是兩邊的和,而且兩邊項的數目要平均。

這裡要先根據係數的大小進行一次排序,從小到大排。相當於是這樣:

k1*x1^p1+k2*x2^p2+k3*x3^p3=k4*x4^p4+k5*x5^p5+k6*x6^p6,其中k的值不一定都為正整數,但一定有序

這樣的話左邊的項中一定含原來是負係數的項,在累加項的過程中,如果發現和小於0則不存入(乙個小優化,因為項數是根據係數從小到大排的,所以如果左項的和已經是負數了,說明在左邊已經含有原來是正係數的項,那麼右邊項肯定都是正數項,其和也是正數,無解了)。

然後對兩個線性表排下序,時間複雜度o(c*log2c),c=m^3;時間複雜度過得去。然後同時遍歷兩個線性表,就可以求解了。

poj 1186 方程的解數

方程的解數 time limit 15000ms memory limit 128000k total submissions 6393 accepted 2198 case time limit 5000ms description 已知乙個n元高次方程 其中 x1,x2,xn是未知數,k1,k2...

poj 1186 方程的解數

題目描述如下 總時間限制 15000ms 記憶體限制 128000kb 描述 已知乙個n元高次方程 其中 x1,x2,xn是未知數,k1,k2,kn是係數,p1,p2,pn是指數。且方程中的所有數均為整數。假設未知數1 xi m,i 1,n,求這個方程的整數解的個數。1 n 6 1 m 150。方程...

poj1186 方程的解數

題目鏈結 已知乙個n元高次方程 其中 x1,x2,xn是未知數,k1,k2,kn是係數,p1,p2,pn是指數。且方程中的所有數均為整數。假設未知數1 xi m,i 1,n,求這個方程的整數解的個數。meet in the middle。移項,分兩部分搜尋,hash判斷兩次dfs的結果是否相同,統計...