hdu 1496 二分或者哈希
来源:互联网 发布:mac pro 创建文件夹 编辑:程序博客网 时间:2024/06/13 13:10
http://acm.hdu.edu.cn/showproblem.php?pid=1496
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.
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.
End of file.
Output
For each test case, output a single line containing the number of the solutions.
Sample Input
1 2 3 -41 1 1 1
Sample Output
390880
二分:
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;typedef long long LL;LL sum[400007];LL ans,k;void erfen(LL t){ int l=0,r=k; int mid; while(l<=r) { mid=(l+r)/2; if(sum[mid]==t) { ans++; //printf("%d\n",ans); for(int x=mid-1; x>=1&&sum[x]==t; x--) { if(sum[x]==t) ans++; } for(int x=mid+1; x<k&&sum[x]==t; x++) { if(sum[x]==t) ans++; } return; } else if(sum[mid]<t) l=mid+1; else r=mid-1; }}int main(){ int a,b,c,d; while(~scanf("%d%d%d%d",&a,&b,&c,&d)) { k=0; if(a>0&&b>0&&c>0&&d>0) { printf("0\n"); continue; } for(int i=1; i<=100; i++) for(int j=1; j<=100; j++) sum[k++]=a*i*i+b*j*j; sort(sum,sum+k); ans=0; for(int i=1; i<=100; i++) for(int j=1; j<=100; j++) { LL t=-(c*i*i+d*j*j); erfen(t); } printf("%I64d\n",ans*16); } return 0;}
哈希:
#include <stdio.h>#include <iostream>#include <string.h>using namespace std;const int maxn=1000005;int vis[2000005];int main(){ int a,b,c,d; while(~scanf("%d%d%d%d",&a,&b,&c,&d)) { if(a>0&&b>0&&c>0&&d>0) { printf("0\n"); continue; } int ans=0; memset(vis,0,sizeof(vis)); for(int i=1;i<=100;i++) for(int j=1;j<=100;j++) vis[i*i*a+b*j*j+maxn]++; for(int i=1;i<=100;i++) for(int j=1;j<=100;j++) ans+=vis[-(c*i*i+d*j*j)+maxn]; printf("%d\n",ans*16); } return 0;}
0 0
- hdu 1496 二分或者哈希
- HDU 2899 (二分 或者 三分)
- HDU 2141 哈希表或者二分
- hdu 2298 Toxophily 公式 或者 三分+二分。
- HDU 1045 fire net【二分匹配或者DFS】
- ★HDU 3605 网络流+缩图 或者二分多重匹配
- hdu-5652 并查集或者二分BFS
- hdu 1045 Fire Net dfs深搜或者二分匹配
- HDU 4080 字符串哈希+二分
- HDU 3360 奇偶染色建二分图 或者 拆点双边建二分图
- 二分 或者 指针
- HDU-4907-Task schedule【二分】/【哈希算法】
- [HDU 4080] Stammering Aliens (字符串哈希+二分)
- HDU 1533 Going Home 最小费用最大流(入门)(模板)或者 二分匹配
- HDU 2426 Interesting Housing Problem 二分匹配(KM模板)或者最小费用最大流
- HDU 1054 Strategic Game(二分图最小点覆盖 或者 树形DP)
- Squares-暴力枚举或者二分
- poj 2785 二分或者hash
- 网络请求传,参数为集合对象的处理
- who left?
- poj1458(最长公共子序列dp)
- Linux防火墙设置
- fragment生命周期,重点是加了activity生命周期
- hdu 1496 二分或者哈希
- 【Cocos2d-x 3.0学习笔记】动作,动画
- 【splay tree】 HDOJ 4441 Queue Sequence
- Android开发历程之四
- wikioi1039数的划分(划分型dp)
- Android-01-Activity
- 【iOS】AsyncSocket的isConnected保险么?
- Android小技巧
- 常用正则表达式