日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

poj 1186 方程的解数(线性探测再哈希)

發(fā)布時(shí)間:2025/3/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 1186 方程的解数(线性探测再哈希) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
方程的解數(shù)
Time Limit:?15000MS?Memory Limit:?128000K
Total Submissions:?7084?Accepted:?2431
Case Time Limit:?5000MS

Description

已知一個(gè)n元高次方程:?
?
其中:x1, x2,...,xn是未知數(shù),k1,k2,...,kn是系數(shù),p1,p2,...pn是指數(shù)。且方程中的所有數(shù)均為整數(shù)。?
假設(shè)未知數(shù)1 <= xi <= M, i=1,,,n,求這個(gè)方程的整數(shù)解的個(gè)數(shù)。?
1 <= n <= 6;1 <= M <= 150。?
?
方程的整數(shù)解的個(gè)數(shù)小于231。?
★本題中,指數(shù)Pi(i=1,2,...,n)均為正整數(shù)。?

Input

第1行包含一個(gè)整數(shù)n。第2行包含一個(gè)整數(shù)M。第3行到第n+2行,每行包含兩個(gè)整數(shù),分別表示ki和pi。兩個(gè)整數(shù)之間用一個(gè)空格隔開(kāi)。第3行的數(shù)據(jù)對(duì)應(yīng)i=1,第n+2行的數(shù)據(jù)對(duì)應(yīng)i=n。

Output

僅一行,包含一個(gè)整數(shù),表示方程的整數(shù)解的個(gè)數(shù)。

Sample Input

3 150 1 2 -1 2 1 2

Sample Output

178


解題思路:這道題直接暴搜肯定回TLE,這里用一點(diǎn)點(diǎn)技巧,把n分成兩半,將左邊的n/2個(gè)數(shù)的所有可能情況放入到哈希表中,那么在枚舉右邊n/2個(gè)數(shù)時(shí)可以直接通過(guò)哈希查詢(xún),這樣可以很快的求解。

#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int MAX = 4000000; struct Hash {int val;int count; }HashTable[MAX]; int n,m,ans; int k[6],p[6]; bool used[MAX];int getpow(int x, int p) { int tmp = 1; while(p) { if(p & 1) tmp *= x; x *= x; p >>= 1; } return tmp; } int searchHash(int s) {int tmp = s;tmp = (tmp % MAX + MAX) % MAX;while(used[tmp] && HashTable[tmp].val != s){tmp++;tmp = (tmp % MAX + MAX) % MAX;}return tmp; }void insert(int s) {int pos = searchHash(s);HashTable[pos].val = s;HashTable[pos].count++;used[pos] = true; }void leftHalf(int d,int s) {if(d == n / 2){insert(s);return;}for(int i = 1; i <= m; i++)leftHalf(d+1,s + k[d] * getpow(i,p[d])); }void rightHalf(int d,int s) {if(d == n){s = -s;int pos = searchHash(s);if(HashTable[pos].val == s)ans += HashTable[pos].count;return;}for(int i = 1; i <= m; i++)rightHalf(d+1,s + k[d] * getpow(i,p[d])); }int main() {scanf("%d%d",&n,&m);for(int i = 0; i < n; i++)scanf("%d%d",&k[i],&p[i]);leftHalf(0,0);rightHalf(n/2,0);printf("%d\n",ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的poj 1186 方程的解数(线性探测再哈希)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。