此题是 2018 年 ICPC Asia Beijing Regional Contest 的 C 题。

题目大意

求斜边长度不超过 $n$($ n \le 10^9$) 的勾股数的数量。不计两直角边的顺序,即勾股数 (a, b, c) 和 (b, a, c) 视作同一组。

分析

这是一道颇为经典的计数问题。

请先阅读维基百科上的 Pythagorean triple 条目。

设斜边为 $n$ 的勾股数有 $f(n)$ 个。又设斜边为 $n$ 的本原勾股数有 $g(n)$ 个。于是有
$ f(n) = \sum_{d \mid n} g(d)$ 。

令 $F$ 为 $f$ 的前缀和,令 $G$ 为 $g$ 的前缀和。有
\begin{aligned}
F(n) &= \sum_{i = 1}^{n} f(n) \\
&= \sum_{i = 1}^{n} \sum_{d \mid i} g(d) \\
&= \sum_{i = 1}^{n} G(\floor{n / i})
\end{aligned}

根据 $G$ 的定义,有

\begin{aligned}
G(n) &= \sum_{i = 1}^{n} g(i) \\
&=\sum_{\substack{1 \le x \le n \\ x \text{ is odd} } } \sum_{\substack{1 \le y \le n \\ y \text{ is even}}} [x^2 + y^2 \le n] [\gcd(x, y) = 1] \\
&= \frac{1}{2} \left(\sum_{1 \le x \le n } \sum_{1 \le y \le n } - \sum_{\substack{1 \le x \le n \\ x \text{ is odd}} } \sum_{\substack{1 \le y \le n \\ y \text{ is odd}} } \right) [x^2 + y^2 \le n] [\gcd(x, y) = 1]
\end{aligned}

\begin{aligned}
& \left(\sum_{1 \le x \le n } \sum_{1 \le y \le n } - \sum_{\substack{1 \le x \le n \\ x \text{ is odd}} } \sum_{\substack{1 \le y \le n \\ y \text{ is odd}} } \right) [x^2 + y^2 \le n] [\gcd(x, y) = 1] \\
&= \left(\sum_{1 \le x \le n } \sum_{1 \le y \le n } - \sum_{\substack{1 \le x \le n \\ x \text{ is odd}} } \sum_{\substack{1 \le y \le n \\ y \text{ is odd}} } \right) [x^2 + y^2 \le n] \sum_{d \mid \gcd(x, y)} \mu(d) \\
&= \sum_{1\le d \le \sqrt{n/2}} \mu(d) \left(\sum_{1 \le x \le n } \sum_{1 \le y \le n } - \sum_{\substack{1 \le x \le n \\ x \text{ is odd}} } \sum_{\substack{1 \le y \le n \\ y \text{ is odd}} } \right) [x^2 + y^2 \le n] [d \mid x] [d \mid y] \\
&= \sum_{1\le d \le \sqrt{n/2}} \mu(d) \left(\sum_{ 1 \le i \le n/d } \sum_{1 \le y \le n } - \sum_{\substack{1 \le i \le n/d \\ di \text{ is odd}} } \sum_{\substack{1 \le y \le n \\ y \text{ is odd}} } \right) [(id)^2 + y^2 \le n] [d \mid y] \\
&= \sum_{1\le d \le \sqrt{n/2}} \mu(d) \left(\sum_{ 1 \le i \le \sqrt{n}/d } \sum_{1 \le j \le \sqrt{n-(id)^2}/d } - \sum_{\substack{1 \le i \le \sqrt{n}/d \\ di \text{ is odd}} } \sum_{\substack{1 \le j \le \sqrt{n-(id)^2}/d \\ dj \text{ is odd}} } \right) 1 \\
&= \sum_{1\le d \le \sqrt{n/2}} \mu(d) \left(\sum_{ 1 \le i \le \sqrt{n}/d } \floor{ \frac{\sqrt{n-(id)^2}}{d} } - [d \text{ is odd}] \sum_{\substack{1 \le i \le \sqrt{n}/d \\ i \text{ is odd}} } \sum_{\substack{1 \le j \le \sqrt{n-(id)^2}/d \\ j \text{ is odd}} } 1 \right) \\
&= \sum_{1\le d \le \sqrt{n/2}} \mu(d) \left(\sum_{ 1 \le i \le \sqrt{n}/d } \floor{ \frac{\sqrt{n-(id)^2}}{d} } - [d \text{ is odd}] \sum_{\substack{1 \le i \le \sqrt{n}/d \\ i \text{ is odd}} } \floor{\frac{\frac{\sqrt{n-(id)^2}}{d} + 1}{2}} \right)
\end{aligned}

TODO:复杂度分析。

Implementation

预处理 $G$ 的前 2000 万项。

注意:代码不完整。

int main() {FAST_READcout << fixed << setprecision(1);
#ifdef LOCALifstream in("main.in");cin.rdbuf(in.rdbuf());
#endifconst int nax = 1e9 + 1;
//    println(nax);const int pre_n = 2e7;vl pre_G(pre_n + 1); // pre-calculate some items of Gconst int max_v = sqrt(pre_n);stp(i, 1, max_v + 1, 2) {const int i2 = i * i;const int max_j = sqrt(pre_n - i2);stp (j, 2, max_j + 1, 2) {if (__gcd(i, j) == 1) {pre_G[i2 + j * j]++;}}}rng (i, 1, pre_n + 1) {pre_G[i] += pre_G[i - 1];}const int max_d = sqrt(nax/2);const auto mu = get_mu(max_d);auto G = [&mu, &pre_G, pre_n](int n) {  // # of primitive Pythagorean triples with c <= nif (n <= pre_n) return pre_G[n];ll ans = 0;const int max_gcd = sqrt(n / 2);const int tmp = (int)sqrt(n);rng (d, 1, max_gcd + 1) {ll sum = 0;const int max_i = tmp / d;for (int i = 1; i <= max_i; ) {const int arg = int(sqrt(n - sq(i*d))) / d;const int j = int(sqrt(n - sq(arg * d))) / d;sum += (j - i + 1) * arg;if (d & 1) {sum -= (j - i + 1 + (i & 1)) / 2 * ((arg + 1) / 2);}i = j + 1;}ans += sum * mu[d];}return ans / 2;};auto F = [&](int n) {  // # of Pythagorean triples with c <= nll ans = 0;for (int i = 1; i <= n; ) {int arg = n / i;int j = n / arg;ans += 1LL * (j - i + 1) * G(arg);i = j + 1;}return ans;};int T; scan(T); rep (T) {int n; scan(n);println(F(n));}#ifdef LOCALcout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endifreturn 0;
}

转载于:https://www.cnblogs.com/Patt/p/10631987.html

hihoCoder #1872 : Pythagorean triple相关推荐

  1. 互为质数的勾股数c语言,c语言 寻求勾股数满足x2+y2=z2的正整数x,y和z称为一组勾股数(pythagorean...

    满意答案 ktjw7387 2014.12.11 采纳率:54%    等级:10 已帮助:1016人 # include "stdio.h" # include "ma ...

  2. D. Pythagorean Triples

    题目来源 一.题目 A Pythagorean triple is a triple of integer numbers (a,b,c) such that it is possible to fo ...

  3. C. Pythagorean Triples

    链接:https://codeforces.com/problemset/problem/707/C Katya studies in a fifth grade. Recently her clas ...

  4. CF707C Pythagorean Triples 题解

    CF707C Pythagorean Triples 题解 题目 链接 字面描述 题面翻译 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 样例 #2 样例输入 #2 样例输 ...

  5. 数论概论学习笔记(一)——勾股数

    版权声明:本文为博主原创文章,未经博主允许不得转载. Pythagoras theorem(勾股定理) 一个直角三角形中,两个直角边边长的平方加起来等于斜边长的平方. 如果设直角三角形的两条直角边长度 ...

  6. 问题 D: 寻求勾股数

    题目描述 满足x2+y2=z2的正整数x,y和z称为一组勾股数(pythagorean triple),又称为毕达哥拉斯三元数组.现在要求你编程求指定范围内的勾股数. 输入 输入若干对数a和b,每对数 ...

  7. 2018 ACM-ICPC Asia Beijing Regional Contest题解

    以下所有AC题解程序来自"仙客传奇"团队. A. Jin Yong's Wukong Ranking List AC的C++语言程序: #include <iostream& ...

  8. c语言寻找勾股数,Numpy 寻找勾股数

    寻找勾股数,勾股数即毕氏三元数(Pythagorean triple),有关勾股数的更多信息请见维基百科页面http://en.wikipedia.org/wiki/Pythagorean_tripl ...

  9. 1226 寻求勾股数

    Description 满足x2+y2=z2的正整数x,y和z称为一组勾股数(pythagorean triple),又称为毕达哥拉斯三元数组.现在要求你编程求指定范围内的勾股数. Input 输入若 ...

最新文章

  1. tf.keras.layers.Conv1D 一维卷积 示例
  2. [case12]演进式架构
  3. iPhone上将短信内容发送到指定邮箱的方法
  4. 2.6 谷歌 Inception 网络简介-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  5. 013 Android锁机病毒分析
  6. eclipse编译hadoop插件
  7. wxpython实现简单图书管理系统
  8. python反距离权重法_反距离权重法 (Spatial Analyst)—ArcMap | 文档
  9. putty远程linux系统时间修改,用putty怎么修改监控服务器时间?
  10. 2018年第九届蓝桥杯【C++省赛B组】【第八题:日志统计】尺取法
  11. QT下信号与槽不在同一个线程中如何connect
  12. Qt程序运行时报错C:\user\administrator\SogouInput\Components\Error程序异常终止
  13. 12306排队是什么意思_12306抢票显示排队中怎么办
  14. BeanAir—无线传感器测试方案
  15. fastboot与fastbootd介绍
  16. SpringBoot基础
  17. SQL22 统计各个部门的工资记录数
  18. 维持两人爱情关系需要慢慢做的事情
  19. 微信小程序屏幕适配不同的iPhone
  20. lstm 文本纠错_中文文本纠错算法--错别字纠正的二三事

热门文章

  1. (转)Python开发规范
  2. 配置普通用户可以运行saltstack的模块
  3. HDU Redraw Beautiful Drawings 推断最大流是否唯一解
  4. SSL:Ubuntu证书配置
  5. 嵌入式成长轨迹53 【Zigbee项目】【CC2430基础实验】【串口时钟PC显示】
  6. roller在eclipse中的部署
  7. C++Builder中开发Activex
  8. C#获取当前路径的方法集合
  9. openwrt编译时遇到的报错
  10. 39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?