程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> hdu 1496 Equations(非常巧妙的hash)

hdu 1496 Equations(非常巧妙的hash)

編輯:關於C語言

 

Equations

 

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

Total Submission(s): 1729    Accepted Submission(s): 662

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

         題目大意,給你a,b,c,d這4個數的值,然後問a*x1^2 + b*x2^2 +  c*x3^2 + d*x4^2 = 0

的(x1,x2,x3,x4)解一共有多少種?

        初看這題,想直接4次循環找,但是這樣絕對超時,所以就用了hash這種方法來解決,很巧妙!分開兩部分求和,若兩部分的和是0,則就加上那麼多種,最後乘以16。這樣就能從n^4變成2*n^2,速度快了很多很多!!!

 

代碼:

Cpp代碼 

#include <iostream> 

#include <stdio.h> 

#include <algorithm> 

#include <memory.h> 

using namespace std; 

 

int f1[1000005];    //保存得數是正的 

int f2[1000005];    //保存得數是負的 

 

int main() 

    int i, j, k, sum; 

    int a, b, c, d; 

    while(scanf("%d %d %d %d", &a, &b, &c, &d) != EOF) 

    { 

        //abcd全部大於0或者小於0,肯定無解。要加上這個,不然超時 

        if(a>0 && b>0 && c>0 && d>0 || a<0 && b<0 && c<0 && d<0) 

        { 

            printf("0\n"); 

            continue; 

        } 

        memset(f1, 0, sizeof(f1)); 

        memset(f2, 0, sizeof(f2)); 

        for(i = 1; i <= 100; i++) 

        { 

            for(j = 1; j<= 100; j++) 

            { 

                k = a*i*i + b*j*j; 

                if(k >= 0) f1[k]++; //k>=0 f1[k]++ 

                else f2[-k]++;      //k<0  f2[k]++ 

            } 

        } 

        sum = 0; 

        for(i = 1; i <= 100; i++) 

        { 

            for(j = 1; j<= 100; j++) 

            { 

                k = c*i*i + d*j*j; 

                if(k > 0) sum += f2[k]; //若k為正,加上的f2[k] 

                else sum += f1[-k];     //若k為負,加上的f1[k] 

            } 

        } 

        printf("%d\n", 16*sum); //每個解有正有負,結果有2^4種 

    } 

 

    return 0; 

}   

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved