{5 3 1}和{7 5 3}是2组不同的等差三组,除了等差的性质之外,还有个奇妙的地方在于:5^2 – 3^2 – 1^2 = 7^2 – 5^2 – 3^2 = N = 15。
现给出一个区间 [a,b]求a <= N <= b 范围内,共有多少对这样的三组。(1 <= a <= b <= 5*10^6)
例如:a = 1,b = 30,输出:4。(注:共有4对,{5 3 1}和{7 5 3},{5 3 1}和{19 15 11},{7 5 3}和{19 15 11},{34 27 20}和{12 9 6}。
int* map; int count3Metas(int a, int b) { int len = b - a + 1; map = new int[len]; memset(map, 0, sizeof(int) * len); /*a=< p*q=N <=b*/ for (int p = 1; p <= b; ++p) { int q = 4 - p % 4; //p+q可被4整除 int qmin = p / 4 + 2; while (q <= b) { int tmp = p * q; if (tmp > b) { break; } if (q >= qmin) { //tmp-a 偏移 map[tmp - a]++; } //保证p+q是4的倍数 q += 4; } } //从n个组取2个: n*(n-1)/2 int result = 0; for (int i = 0; i < len; ++i) { result += map[i] * (map[i] - 1); } return result / 2; }
今天的文章 三组的数量分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/101523.html