方程的解數
time limit:15000ms
memory limit:128000k
total submissions:6393
accepted:2198
case time limit:5000ms
description
已知乙個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)均為正整數。
input
第1行包含乙個整數n。第2行包含乙個整數m。第3行到第n+2行,每行包含兩個整數,分別表示ki和pi。兩個整數之間用乙個空格隔開。第3行的資料對應i=1,第n+2行的資料對應i=n。
output
僅一行,包含乙個整數,表示方程的整數解的個數。
sample input
3sample output1501 2
-1 2
1 2
178source
noi 01
初學hash做的第一道題,基本是照搬別人的程式。。。。。。看了一遍,自己敲了一遍,發現這是最普通的那種開放定址加線性探查,然後期間用官方的pow函式死活不過,於是最後妥協了自己寫的。。。。。
就是把算式剖開兩半,然後對前面三個的結果做hash,之後對後面三個的結果的取反找hash,然後如果加起來是0那就是解。。感覺這個方法比較好,所以也記錄一下。
#include #include#include #include #include #define max 4444444
using namespace std;
void left_ser(int d, int s);
void right_ser(int d, int s);
void insert_hash(int s);
int hash(int s);
int getpow(int x, int p);
struct hashhash_t[max];
int use[max] = ;
int mid, n, m, ans;
int k[11], p[11];
int main()
ans = 0;
mid = n >> 1;
left_ser(0, 0);
right_ser(mid, 0);
printf("%d\n", ans);
return 0;
}void left_ser(int d, int s)
for (i = 1;i <= m;i ++)
}void right_ser(int d, int s)
return;
}for (i = 1;i <= m;i ++)
}void insert_hash(int s)
int hash(int s)
}return temp;
}int getpow(int x, int p)
return tmp;
}
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。方程...
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的結果是否相同,統計...