HDU 6211 Pythagoras (勾股数+暴力枚举+优化)
2017-09-18 01:40
351 查看
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6211
毕达哥拉斯三元组,也就是勾股数可以表示为:
x=a^2-b^2
y=2ab
z=a^2+b^2,其中 a>b。
其中z最大,x和y的大小不确定。
同时当a,b互质时,这一组勾股数也互质。
通过暴力枚举a,b,使得 a^2+b^2<10^9,从而枚举10的9次方以内的勾股数。其中b的上限大约是sqrt(5*10^8)。
题中k最大为17,也就是最多只有131072个数,将符合要求的数取模131072后计数。而之后求模4得1的勾股数数量也就是模131072得1,5,9…的数量。
一些优化:
1、判断a,b互质时,直接写gcd函数会超时,可以求出b的质因子,判断a是否含有这些质因子。因为b的范围不超过30000,所以质因子不会超过5个。预处理求出所有数的质因子。
2、a,b奇偶性相同时,a^2-b^2和2ab都是偶数,必然不互质。所以可以利用a,b奇偶性不同来进行优化。
毕达哥拉斯三元组,也就是勾股数可以表示为:
x=a^2-b^2
y=2ab
z=a^2+b^2,其中 a>b。
其中z最大,x和y的大小不确定。
同时当a,b互质时,这一组勾股数也互质。
通过暴力枚举a,b,使得 a^2+b^2<10^9,从而枚举10的9次方以内的勾股数。其中b的上限大约是sqrt(5*10^8)。
题中k最大为17,也就是最多只有131072个数,将符合要求的数取模131072后计数。而之后求模4得1的勾股数数量也就是模131072得1,5,9…的数量。
一些优化:
1、判断a,b互质时,直接写gcd函数会超时,可以求出b的质因子,判断a是否含有这些质因子。因为b的范围不超过30000,所以质因子不会超过5个。预处理求出所有数的质因子。
2、a,b奇偶性相同时,a^2-b^2和2ab都是偶数,必然不互质。所以可以利用a,b奇偶性不同来进行优化。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> using namespace std; long long num[131072];//2的17次方 const int INF=1000000000; vector<int> pf[25000];//存质因子 int main() { //求质因子 for(int i=2;i*i<=INF/2;i++) { int ii=i; for(int j=2;j<=i;j++) { if(ii==1) break; if(ii%j==0) { pf[i].push_back(j); while(ii%j==0) { ii/=j; } } } } //暴力求所有符合要求的y for(int b=1;b*b<=INF/2;b++) { for(int a=b+1;a*a+b*b<=INF;a+=2)//利用a、b奇偶性不同,这里写a++会超时 { //判断a、b是否互质,直接写gcd会超时 int flag=1; for(int i=0;i<pf[b].size();i++) { if(a%pf[b][i]==0)//a、b有相同的质因子 { flag=0; break; } } if(!flag) continue; num[max(2*a*b,a*a-b*b)%131072]++; } } int T; scanf("%d",&T); while(T--) { int k; scanf("%d",&k); long long ans=0; int n=1<<k; for(int i=0;i<n;i++) { int t; scanf("%d",&t); for(int j=0;j*n+i<131072;j++) { ans+=t*num[j*n+i]; } } printf("%lld\n",ans); } return 0; }
相关文章推荐
- Hdu 6211 Pythagoras(暴力+勾股数)
- 【2017青岛网络赛】1006 hdu 6211 Pythagoras 打表+本原勾股数
- hdu 5952 Counting Cliques 暴力枚举+优化
- HDU 1856 More is better(并查集路径压缩+剪枝优化+暴力枚举)
- HDU-4932-Miaomiao's Geometry【暴力枚举】
- hdu 5247 找连续数【暴力枚举】
- hdu 5128 The E-pang Palace(计算几何,暴力枚举)
- HDU 4770 Lights Against Dudely (2013杭州赛区1001题,暴力枚举)
- HDU 5616 Jam's balance(暴力枚举子集)
- hdu 6058 暴力枚举
- hdu 4770 Lights Against Dudely(暴力枚举dfs)
- HDU 1405 The Last Practice(暴力枚举)
- HDU 5175 Misaki's Kiss again(暴力枚举+异或运算)
- HDU 5310 Hidden String(暴力枚举)
- HDU 5961 传递(暴力枚举)
- Hdu 5024 Wang Xifeng's Little Plot(暴力枚举)
- HDU 1172 猜数字 暴力枚举
- UVA 11210 暴力枚举 + 递归(hdu 4431)
- Hdu 4309Seikimatsu Occult Tonneru【最大流Dinic+暴力枚举Dfs+建图】人生难免磕磕碰碰
- HDU 4082 Hou Yi's secret (几何,求相似三角形个数,暴力枚举,map记录)