HDU 杭电 1496 (Hash求解)

看到这题首先想到的是四重for循环,肯定超时,但还是很想试一下,结果和预期一样;然后就换成三重循环,结果还是超时;最后就换成 hash求解(第一次接触)两重循环。由题意可得a*x1*x1+b*x2*x2=-(c*x3*x3+d*x4*x4)才满足条件,hash数组至少开200W (因为50 * 100 *100+50 *100 *100=100W).
如果有兴趣了解hash可以访问  


  1. #include<cstdio>
  2. #include<cstring>
  3. const int maxn=2000000+10;
  4. int hash[maxn];
  5. int t[100+5];               //用于储存i=1~100 ,i*i的值
  6. int main(){
  7.     int a,b,c,d;
  8.     for(int i=1;i<=100;i++)t[i]=i*i;
  9.     while(scanf("%d%d%d%d",&a,&b,&c,&d)==4){
  10.         if(a>0 && b>0 &&c>0 && d>0  ||a<0 &&b<0 &&c<0 &&d<0)printf("0\n");          //全小于0 或全大于0 输出0
  11.         else {
  12.             int count=0;
  13.             memset(hash,0,sizeof(hash));
  14.             for(int i=1;i<=100;i++)
  15.                 for(int j=1;j<=100;j++)
  16.                     hash[1000000+a*t[i]+b*t[j]]++;

  17.             for(int i=1;i<=100;i++)
  18.              for(int j=1;j<=100;j++)
  19.                count+=hash[1000000-(c*t[i]+d*t[j])];
  20.               printf("%d\n",16*count);  //因为每个xi都有两个值(正,负),所以共有2的4次方16倍
  21.         }
  22.     }
  23.     return 0;
  24. }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柏油

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值