Uva 106 - Fermat vs. Pythagoras 解题报告
2024-09-08 15:38:41
数论题,考查了本原勾股数(PPT)
对一个三元组(a,b,c)两两互质
且满足 a2 + b2 = c2
首先有结论
a 和 b 奇偶性不同 c总是奇数(可用反证法证明,不赘述)
设 a为奇数 b为偶数 a,b,c互质
有
a2 = c2 – b2 =(c-b)(c+b)
由于c和b互质 且a为奇数
(c-b)与(c+b)也互质
令(c+b)=s2 (c-b)=t2
有 c=(s2+t2)/2 b=(s2-t2)/2
a=st
这时可以枚举s 和 t 保证 s t 互质
非本原勾股数只需乘上一个系数即可
#include <iostream>
#include <math.h>
#include <cstring>
int flag[];
using namespace std;
int main()
{
int i,m,n,maxm,maxn;
int ans=;
for (;cin>>i;ans=)
{
memset(flag,,sizeof flag);
maxm=(int)sqrt((float)i-);
for (m=;m<=maxm;++m)
{
maxn=(int)sqrt((float)i-m*m);
maxn=maxn>=m?m-:maxn;
for(n=;n<=maxn;++n)
{
if(n%!=m%)
{
int a=m,b=n,c;
for(int r; (r = a % b) != ; a = b, b = r);
if (b == )
{
++ans;
a = m * m - n * n, b = * m * n, c = m * m + n * n;
for (int k = ; c * k <= i; ++k)
{
flag[a * k] = flag[b * k] = flag[c * k] = ;
}
}
}
}
}
cout << ans << " ";
for (ans = , m = ; m <= i; ans += !flag[m++]);
cout << ans << endl;
}
return ;
}
最新文章
- 浏览器 HTTP 协议缓存机制详解
- insertAdjacentHTML和insertAdjacentText方法
- item3 二维数组中的查找[剑指offer]
- Android 广播(内部类)
- IOS7最新的系统漏洞
- Android Volley 之自定义Request
- 用 gulp.spritesmith 自动化雪碧图
- Linux Ubuntu从零开始部署web环境及项目 -----部署项目 (三)
- Mysql 删除重复记录,只保留最小的一条
- remote: Incorrect username or password ( access token )
- foreach加循环体与不加循环体的区别
- 细说log4j之log4j 1.x
- Java内存模型及Java关键字 volatile的作用和使用说明
- vagrant特性——基于docker开发环境(docker和vagrant的结合)-4-简单例子-有问题
- 2013长春网赛1004 hdu 4762 Cut the Cake
- 【AtCoder】ARC088
- 【Unity】2.9 光源(Lights)
- iOS 开发之UIStackView的应用
- linux下的时间管理概述
- hihocoder1580 Matrix