数论 —— 毕达哥拉斯三元组
【定义】
满足 的
三元组称为毕达哥拉斯三元组,当
时,称其为本原的。
毕达哥拉斯三元组,也称为勾股数。
【性质】
由 x、y、z 构成的三元组 (x,y,z) ,其中 y 为偶数,那么由他们构成的本原的毕达哥拉斯三元组
等价于:
存在互素的一奇一偶的正整数 m、n,且 m>n,有:,并且可以看出,本原的毕达哥拉斯三元组中,最大的数一定是奇数。
特别地,由 构成毕达哥拉斯三元组,将
即得
【实现】
求解 n 以内本原的毕达哥拉斯三元组个数
根据 ,只要枚举一下 m、n(m,n<=sqrt(n)),然后将三元组乘以 i (保证 i*z 在范围内),即可求出所有的毕达哥拉斯三元组。
int x[N],y[N],z[N];
int pythagoras(int n){
int num=0;//数组游标
int res=0;//本原三元组的个数
int m=sqrt(n*1.0);
for(int i=1;i<=m;i+=2){//从1开始,每次+2,保证为奇数
for(int j=2;j<=m;j+=2){//从2开始,每次+2,保证为偶数
a=max(i,j);//大的为m
b=min(i,j);//小的为n
if(gcd(i,j)!=1)//要求m、n互质
continue;
x[num]=a*a-b*b;
y[num]=2*a*b;
z[num]=a*a+b*b;
num++;
if( (a*a+b*b)<=n )//保证在范围内
res++;
}
}
return res;
}
【例题】
- Fermat vs. Pythagoras(POJ-1305)(毕达哥拉斯三元组):点击这里
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通