zoukankan      html  css  js  c++  java
  • HDU 1496 Equations

    Equations
    Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 8028 Accepted Submission(s): 3274


    Problem Description Consider equations having the following form:

    a*x12+b*x22+c*x32+d*x42=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


    Author LL
    Source [“2006校园文化活动月”之“校庆杯”大学生程序设计竞赛暨杭州电子科技大学第四届大学生程序设计竞赛](http://acm.hdu.edu.cn/search.php?field=problem&key=%A1%B02006%D0%A3%D4%B0%CE%C4%BB%AF%BB%EE%B6%AF%D4%C2%A1%B1%D6%AE%A1%B0%D0%A3%C7%EC%B1%AD%A1%B1%B4%F3%D1%A7%C9%FA%B3%CC%D0%F2%C9%E8%BC%C6%BE%BA%C8%FC%F4%DF%BA%BC%D6%DD%B5%E7%D7%D3%BF%C6%BC%BC%B4%F3%D1%A7%B5%DA%CB%C4%BD%EC%B4%F3%D1%A7%C9%FA%B3%CC%D0%F2%C9%E8%BC%C6%BE%BA%C8%FC+&source=1&searchmode=source)
    解析:折半枚举+哈希。依据折半枚举的思想,可以将等式a*x1^2+b*x2^2+c*x3^2+d*x4^2 = 0转化为a*x1^2+b*x2^2 = -(c*x3^2+d*x4^2)后进行枚举,这样大大降低了枚举量。根据所给的数据范围,易知a*x1^2+b*x2^2和-(c*x3^2+d*x4^2)均位于区间[-1000000, 1000000]内,因而可以建立一个哈希表h[],数据x映射到x+1000000处。即初始化h[]为0,枚举等式a*x1^2+b*x2^2 = -(c*x3^2+d*x4^2)的左边,每当x出现时,h[x+1000000]++。枚举等式右边时,结果加上h[x+1000000]即可。
    ``` #include #include

    const int offset = 1000000;
    int h[offset*2+5];
    int a, b, c, d;

    void solve()
    {
    memset(h, 0, sizeof h);
    for(int i = -100; i <= 100; ++i){
    if(i != 0){
    for(int j = -100; j <= 100; ++j){
    if(j != 0){
    int x = aii+bjj;
    ++h[x+offset];
    }
    }
    }
    }
    int res = 0;
    for(int i = -100; i <= 100; ++i){
    if(i != 0){
    for(int j = -100; j <= 100; ++j){
    if(j != 0){
    int x = -(cii+djj);
    res += h[x+offset];
    }
    }
    }
    }
    printf("%d ", res);
    }

    int main()
    {
    while(~scanf("%d%d%d%d", &a, &b, &c, &d)){
    if((a>0 && b>0 && c>0 && d>0) || (a<0 && b<0 && c<0 && d<0)){
    printf("0 ");
    continue;
    }
    solve();
    }
    return 0;
    }

  • 相关阅读:
    Spring Boot中只能有一个WebMvcConfigurationSupport配置类
    【原创】(六)Linux进程调度-实时调度器
    【原创】(二)Linux进程调度器-CPU负载
    【原创】(十二)Linux内存管理之vmap与vmalloc
    【原创】(十一)Linux内存管理slub分配器
    【原创】(七)Linux内存管理
    【原创】(五)Linux内存管理zone_sizes_init
    【原创】(三)Linux paging_init解析
    【原创】(二)Linux物理内存初始化
    【原创】(一)ARMv8 MMU及Linux页表映射
  • 原文地址:https://www.cnblogs.com/inmoonlight/p/6033928.html
Copyright © 2011-2022 走看看