zoukankan      html  css  js  c++  java
  • hdu1496 hash

    题意:方程式为a*x1^2+b*x2^2+c*x3^2+d*x4^2=0
    a, b, c, d 是 [-50,50] 区间内非零整数.

     ( x1,x2,x3,x4 ) 是[-100,100]区间内的非零整数。

    问的是方程的解的情况有几种。

    直接暴力4层for循环必超时。。看了杭电的课件后理解了这是一道hash 的,并且有巧妙的解法。

    然后O(n^4)的复杂度编程了O(n^2)

    #include <iostream>
    #define MAX 2000000
    int hash[MAX+3];
    int squ[101];
    int main()
    {
    	using std::cin;//这里之所以这样写,而没有开头用using namespace std;
    	using std::cout;//是因为我用的vs2010会提示下面hash不明确,想必是std里有hash的声明什么的了。
    	using std::endl;//我又不想改成大写字母的hash,那就这样喽。
    	int a,b,c,d;
    	for(int i=1;i<=100;i++)
    		squ[i]=i*i;
    	while(cin>>a>>b>>c>>d)
    	{
    		if((a>0&&b>0&&c>0&&d>0)||(a<0&&b<0&&c<0&&d<0))
    		{
    			cout<<0<<endl;
    			continue;
    		}
    		memset(hash,0,sizeof(hash));
    		for(int i=1;i<=100;i++)
    			for(int j=1;j<=100;j++)
    				hash[a*squ[i]+b*squ[j]+1000000]++;
    		int sum=0;
    		for(int i=1;i<=100;i++)
    			for(int j=1;j<=100;j++)
    				sum+=hash[-(c*squ[i]+d*squ[j])+1000000];
    		cout<<sum*16<<endl;//16是因为上面求出的四个数的解是平方数,真正的x1,x2,x3,x4是这四个数的根,各有正负两种情况,即2^4=16
    	}
    }
    


  • 相关阅读:
    5、垂直拆分---分库--mycat
    4、读写分离---双主双从(mycat)
    3、读写分离---一主一从(mycat)
    2、安装启动(Mycat)
    1、入门(Mycat)
    Nginx 相关参数记录(2)
    Nginx 相关参数记录(1)
    Linux
    一大波学习内容!
    开源镜像站
  • 原文地址:https://www.cnblogs.com/unclejelly/p/4082133.html
Copyright © 2011-2022 走看看