您的位置:首页 > 其它

[Swust OJ 166]--方程的解数(hash法)

2015-06-12 20:30 309 查看
题目链接:http://acm.swust.edu.cn/problem/0166/

Time limit(ms): 5000      Memory limit(kb): 65535

有如下方程组: A1*x1^3+A2*x2^3+A3*x3^3+A4*x4^3+A5*x5^3=0,其中A1…A5都在[-50,50]内。 如果(x1,x2,x3,x4,x5)(其中-50<=xi<=50,xi!=0)能让该等式成立,就说(x1,x2,x3,x4,x5)为其一组解,现在的问题是要问你该等式共有多少组解。

Description

输入包括5个系数 A1,A2,A3,A4,A5

注意:这里是多组输入哈,太坑爹了!

Input

输出该方程解的数目

Output

1

23 45 36 13 57

Sample Input

1

1436

解题思路:明显的hash,但是想了想,这里的系数[-50,50],x范围[-50,50],
     那么求得的解的变换范围为[-12500000,12500000]数组大小25000000(内存直接爆了)
     表示智商捉急~~然后晓得了还有short 这个东东(http://bbs.csdn.net/topics/370037447
     然后卡到内存ac了
代码如下:

#include <stdio.h>
#include <math.h>
#include <string.h>
#define maxn 200005
int hash[maxn][10], num[maxn];
int main(){
int i, j, k, l, cnt, tmp, mark, a[5];
while (~scanf("%d%d%d%d%d", &a[0], &a[1], &a[2], &a[3], &a[4])){
memset(num, 0, sizeof(num));
cnt = 0;
for (i = -50; i <= 50; i++){
if (i){
for (j = -50; j <= 50; j++){
if (j){
tmp = a[0] * i*i*i + a[1] * j*j*j;
mark = abs(tmp) % maxn;
hash[mark][num[mark]] = tmp;
num[mark]++;
}
}
}
}
for (i = -50; i <= 50; i++){
if (i){
for (j = -50; j <= 50; j++){
if (j){
for (k = -50; k <= 50; k++){
if (k){
tmp = a[2] * i*i*i + a[3] * j*j*j + a[4] * k*k*k;
mark = abs(tmp) % maxn;
for (l = 0; l < num[mark]; l++)
if (tmp == hash[mark][l]) cnt++;
}
}
}
}
}
}
printf("%d\n", cnt);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: