poj1840 Eqs(哈希表)

原題鏈接:Eqs

題意:求滿足方程的解的個數

枚舉打表吧

#include <cstring>
#include <iostream>
using namespace std;
const int MAX_S = 50 * 50 * 50 * 50 * 2;	//前兩項和的最大值 
short ht[MAX_S * 2 + 1];	//*2 此處用short類型,內存勉強過了 
int main(){
	int a1, a2, a3, a4, a5, sum;
	while(cin >> a1 >> a2 >> a3 >> a4 >> a5 && (a1 || a2 || a3 || a4 || a5)){
		memset(ht, 0, sizeof(ht));
		for(int x1 = -50;x1 < 51;x1 ++){	if(x1 == 0) continue;
			for(int x2 = -50;x2 < 51;x2 ++){	if(x2 == 0) continue;
				sum = -1 * (a1 * x1* x1* x1 + a2 * x2* x2* x2) + MAX_S;	//將負的變爲正的 
				++ ht[sum];	//將前兩項的和的個數保存在數組中 
			}
		}
		int ans = 0;
		for(int x3 = -50;x3 < 51;x3 ++){	if(x3 == 0) continue;
			for(int x4 = -50;x4 < 51;x4 ++){	if(x4 == 0) continue;
				for(int x5 = -50;x5 < 51;x5 ++){	if(x5 == 0) continue;
					sum = a3 * x3* x3* x3 + a4 * x4* x4* x4 + a5 * x5* x5* x5 + MAX_S;
					if(sum >= 0 && sum < 2 * MAX_S && ht[sum]){	//sum<0或者sum小於前兩項和的二倍說明不會相等 
						ans += ht[sum];
					}
				}
			}
		}
		cout << ans << endl;
	}
	return 0;
}


構造散列函數,用散列表空間上節省好多

#include <cstdio>
#include <cstring>
using namespace std;
const int MOD = 100003;	
const int MAX_N = 1000000 + 5;	
int hash[MOD + 1];	//hash[key]保存當前關鍵字key的對應data的下標 
int data[MAX_N], next[MAX_N];	//data[i]枚舉的第i個前三項和的值,next[i]保存同一關鍵字下data的下標
int sz;
void insert(int x){
	data[sz] = x;
	int t = x > 0 ? x : -x;
	int key = (t / MOD + t % MOD) % MOD;	//哈希函數 
	next[sz] = hash[key];
	hash[key] = sz;
	sz ++;
}
int find(int x){
	int t = x > 0 ? x : -x;
	int key = (t / MOD + t % MOD) % MOD;
	int dex = hash[key], count = 0;
	while(dex > 0){ //同一關鍵下搜索 
		if(data[dex] == x)	count ++;
		dex = next[dex];
	}
	return count;
}
int main(){
	int a1, a2, a3, a4, a5;
	while(~scanf("%d%d%d%d%d", &a1, &a2, &a3, &a4, &a5)){
		int i, j, k, ans = 0;
		sz = 1;
		memset(hash, 0, sizeof(hash));	//初始化爲每個關鍵子的下標都爲0 
		for(i = -50;i <= 50;i ++){	if(!i)	continue;
			for(j = -50;j <= 50;j ++){	if(!j)	continue;
				for(k = -50;k <= 50;k ++){	if(!k)	continue;
					insert(a1 * i * i * i + a2 * j * j * j + a3 * k * k * k);
				}
			}
		}
		for(i = -50;i <= 50;i ++){	if(!i)	continue;
			for(j = -50;j <= 50;j ++){	if(!j)	continue;
				ans += find(-(a4 * i * i * i + a5 * j * j * j));
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}


發佈了100 篇原創文章 · 獲贊 71 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章