poj 1186 方程的解數

2021-06-25 22:38:38 字數 1508 閱讀 7095

題目描述如下:

總時間限制:

15000ms

記憶體限制:

128000kb

描述

已知乙個n元高次方程:

其中:x1, x2,...,xn是未知數,k1,k2,...,kn是係數,p1,p2,...pn是指數。且方程中的所有數均為整數。

假設未知數1 <= xi <= m, i=1,,,n,求這個方程的整數解的個數。

1 <= n <= 6;1 <= m <= 150。

方程的整數解的個數小於2

31。★本題中,指數pi(i=1,2,...,n)均為正整數。

輸入第1行包含乙個整數n。第2行包含乙個整數m。第3行到第n+2行,每行包含兩個整數,分別表示ki和pi。兩個整數之間用乙個空格隔開。第3行的資料對應i=1,第n+2行的資料對應i=n。

輸出僅一行,包含乙個整數,表示方程的整數解的個數。

樣例輸入

3

1501 2

-1 2

1 2

樣例輸出

178
一看到題目時,除了暴力,一時也沒思路,於是在網上檢視了幾個人的部落格,總結了一下思路。

例如,有n=6,即有6個xi項需要計算,這時,可先計算前三個項的和s,再計算後三個項若後三項的和等於-s,則找到乙個解。

程式裡將每乙個s的和儲存在map容器裡,這樣計算後三項時查詢-s時,可以更快,因為map裡的key與value是通過hash匹配的。

程式裡,用到了遞迴,例如findleft函式,它計算前n/2項的和s,並把它儲存在countmap容器裡。findright函式計算後n/2項的和,轉換成-s,並檢視在countmap裡,是否有相等項,注意,必須使用count()函式來判斷s是否在map容器裡,而不能直接使用countmap[s],因為這樣會在容器中增加新項,從而導致記憶體占用過大。

程式的**如下:

#include #include using namespace std;

int countn,n,m,mid,k[6],p[6];

mapcountmap;

// 搜尋前一半

void findleft(int xi, int temps)

int t;

for (int i = 1; i <= m; ++i)

}// 搜尋另一半,並將結果返回至列表

void findright(int xi, int temps)

int t;

for (int i = 1; i <= m; ++i)

} int main()

{ cin >> n >> m;

mid = n / 2;

for (int i = 0; i < n; ++i)

cin >> k[i] >> p[i];

findleft(0,0);

findright(mid, 0);

cout << countn <

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 方程的解數

一道資料結構的水題。題意為給予乙個最多含六個未知數的方程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。到...

poj1186 方程的解數

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