Chgtaxihe's blog Chgtaxihe's blog
首页
练习
算法学习
读书笔记
小玩意

Chgtaxihe

首页
练习
算法学习
读书笔记
小玩意
  • 数论

    • 一些小问题
    • 二次剩余学习笔记
    • 卡特兰数学习笔记
    • 同余最短路学习笔记
    • 康托展开学习笔记
    • 快速傅里叶变换学习笔记
    • 拉格朗日插值学习笔记
    • 拓展欧几里得学习笔记
    • 斐波那契数列学习笔记
    • 斯特林数笔记
    • 本原勾股数组学习笔记
      • 其他性质
      • 51nod 1165
    • 模运算学习笔记
    • 欧拉函数
    • 类欧几里得学习笔记
    • 素性检测与大数分解
    • 素数计数问题
    • 组合数问题
    • 高斯整数学习笔记
  • 动态规划

  • 暴力

  • 图论

  • 数据结构

  • 字符串

  • 几何

  • 博弈论

  • 其他

本原勾股数组学习笔记

# 前置知识

高斯整数(推荐)

# 定义与性质

对于a2+b2=c2a^2+b^2=c^2a2+b2=c2,且gcd(a,b,c)=1gcd(a,b,c)=1gcd(a,b,c)=1,那么a,ba,ba,b定为一奇一偶,ccc为奇数,我们约定aaa为奇数,bbb为偶数

每个本原勾股数组(a,b,c)(a, b, c)(a,b,c),都可以由一对互质的整数s,ts,ts,t得出

s2=c+b,t2=c−bs^2=c+b,\ t^2=c-bs2=c+b,t2=c−b

该三角形的周长C=s(s+t)C=s(s+t)C=s(s+t)

a=st,b=s2−t22,c=s2+t22(s>t>0)a=st, b=\frac{s^2-t^2}{2}, c=\frac{s^2+t^2}{2}\ (s>t>0)a=st,b=2s2−t2​,c=2s2+t2​(s>t>0)

下面证明c+b,c−bc+b,c-bc+b,c−b必是平方数

a2=s2t2a^2=s^2t^2 a2=s2t2

设gcd(b−c,b+c)=dgcd(b-c,b+c)=dgcd(b−c,b+c)=d,则d∣((b−c)+(b+c)),d∣((b+c)−(b−c))d\mid ((b-c)+(b+c)), d\mid ((b+c)-(b-c))d∣((b−c)+(b+c)),d∣((b+c)−(b−c)),即d∣2b,d∣2cd\mid 2b, d\mid 2cd∣2b,d∣2c

因为2∤(b+c)2\not \mid (b+c)2∣(b+c),因此d∣b,d∣cd\mid b, d\mid cd∣b,d∣c,又因为gcd(b,c)=1gcd(b,c)=1gcd(b,c)=1,因此b−c,b+cb-c, b+cb−c,b+c互质。

进而有s2,t2s^2,t^2s2,t2互质

因为a2a^2a2为平方数,因此s,ts,ts,t为平方数。

上述过程同时也证明了s,ts,ts,t互质

# 其他性质

(a,b,c)(a,b,c)(a,b,c)中a,ba,ba,b有且仅有一个是3的倍数,ccc不是3的倍数

(a,b,c)(a,b,c)(a,b,c)中有且只有一个为5的倍数

# 例题

# 51nod 1165 (opens new window)

题目:直角三角形,三条边的长度都是整数。给出周长NNN,求符合条件的三角形数量。

由于周长C=s(s+t)C=s(s+t)C=s(s+t),且N≤1e7N\le1e7N≤1e7,那么我们可以遍历sss,可知s<sqrt(1e7)s<sqrt(1e7)s<sqrt(1e7),求出所有本原直角三角形

AC代码如下(关闭流同步后,耗时:375ms)复杂度: 近似O(n)O(n)O(n)

#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int maxn = 1e7 + 100;
int ans[maxn]={0}, t, n;

int main(){
    ll limit = sqrt(maxn)+1, cir;
    for(int s=3; s<=limit; s+=2){ // s为奇数
        for(int t=1; t<s; t+=2){ // t为奇数
            if(__gcd(s, t) != 1) continue;
            cir = s*(s+t);
            for(int k=1; k*cir<maxn; k++) ans[k*cir]++; // 计算贡献
        }
    }
    cin >> t;
    while(t--) {
        cin >> n;
        cout << ans[n] << '\n';
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# 参考资料

走进数论——神奇的勾股数组 (opens new window)

【数论】本原勾股数组(PPT)的性质 (opens new window)

上次更新: 2021/02/24, 03:37:30
斯特林数笔记
模运算学习笔记

← 斯特林数笔记 模运算学习笔记→

最近更新
01
深入理解Java虚拟机
03-04
02
DNS工作原理
02-27
03
改用VuePress啦
02-23
更多文章>
Theme by Vdoing | Copyright © 2019-2021
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式