poj 1186 方程的解数(线性探测再哈希)
生活随笔
收集整理的這篇文章主要介紹了
poj 1186 方程的解数(线性探测再哈希)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
方程的解數(shù)
?
其中: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ù)。?
| 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 2Sample 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)題。
- 上一篇: hdu 5636 Shortest Pa
- 下一篇: Jeewx企业号系统入门配置指南