您的位置:首页 > 其它

hdu1496—Equations(枚举)

2017-06-03 18:28 225 查看
题目链接:传送门


Equations

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 8411    Accepted Submission(s): 3468


Problem Description

Consider equations having the following form: 

a*x1^2+b*x2^2+c*x3^2+d*x4^2=0

a, b, c, d are integers from the interval [-50,50] and any of them cannot be 0.

It is consider a solution a system ( x1,x2,x3,x4 ) that verifies the equation, xi is an integer from [-100,100] and xi != 0, any i ∈{1,2,3,4}.

Determine how many solutions satisfy the given equation.

 

Input

The input consists of several test cases. Each test case consists of a single line containing the 4 coefficients a, b, c, d, separated by one or more blanks.

End of file.

 

Output

For each test case, output a single line containing the number of the solutions.

 

Sample Input

1 2 3 -4
1 1 1 1

 

Sample Output

39088
0

解题思路:直接枚举100^4肯定会超时,令a*x1^2+b*x2^2 = -c*x3^2-d*x4^2

先算出左半部分的值打个表,然后算出右半部分的值有多少个和表中值相等,时间复杂度为100^2

注意该题的坑:打表的数组得开个两百万左右,所以初始化很耗时,memset比fill快

对于a,b,c,d同时大于0或小于0的情况直接判断,否则会超时,初始化得在这个判断后执行,否则用fill会超时,用memset勉强a过

哎,说多了都是泪!

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <queue>
#include <set>
#include <string>
#include <stack>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
const int N = 2000007;
const int M = 1000001;
const int INF = 0x3fffffff;
const int mod = 1e9+7;
const double Pi = acos(-1.0);
const double sm = 1e-9;

int rec
;

int main()
{
int a,b,c,d;
while( ~scanf("%d%d%d%d",&a,&b,&c,&d) ){
int tot = 0;
//fill( rec , rec+N , 0 );
if( (a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0) ){
printf("0\n");continue;
}
memset( rec , 0 , sizeof(rec) );
for( int x1 = 1 ; x1 <= 100 ; ++x1 ){
for( int x2 = 1; x2 <= 100 ; ++x2 ){
int p = a*x1*x1+b*x2*x2;
rec[p+M] += 4;
}
}
for( int x3 = 1 ; x3 <= 100 ; ++x3 ){
for( int x4 = 1 ; x4 <= 100 ; ++x4 ){
int p = -c*x3*x3-d*x4*x4;
tot += rec[p+M]*4;
}
}
printf("%d\n",tot);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: