Uva 106 - Fermat vs. Pythagoras 解题报告
2013-12-01 18:59
369 查看
数论题,考查了本原勾股数(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 互质
非本原勾股数只需乘上一个系数即可
View Code
对一个三元组(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[1000001]; using namespace std; int main() { int i,m,n,maxm,maxn; int ans=0; for (;cin>>i;ans=0) { memset(flag,0,sizeof flag); maxm=(int)sqrt((float)i-1); for (m=2;m<=maxm;++m) { maxn=(int)sqrt((float)i-m*m); maxn=maxn>=m?m-1:maxn; for(n=1;n<=maxn;++n) { if(n%2!=m%2) { int a=m,b=n,c; for(int r; (r = a % b) != 0; a = b, b = r); if (b == 1) { ++ans; a = m * m - n * n, b = 2 * m * n, c = m * m + n * n; for (int k = 0; c * k <= i; ++k) { flag[a * k] = flag[b * k] = flag[c * k] = 1; } } } } } cout << ans << " "; for (ans = 0, m = 1; m <= i; ans += !flag[m++]); cout << ans << endl; } return 0; }
View Code
相关文章推荐
- UVa 106/POJ 1305 Fermat vs. Pythagoras(数论&勾股数)
- UVA 106 - Fermat vs. Pythagoras (勾股数和素勾股数)
- uva 106 - Fermat vs. Pythagoras(素勾股数)
- uva106 - Fermat vs. Pythagoras 互素勾股数
- uva 106 - Fermat vs. Pythagoras
- UVa 106 - Fermat vs. Pythagoras 素勾股数
- uva106 - Fermat vs. Pythagoras()
- uva 106 Fermat vs. Pythagoras(勾股数求法)
- UVa 106 - Fermat vs. Pythagoras 素勾股数
- UVa 106 - Fermat vs. Pythagoras
- UVA 106 - Fermat vs. Pythagoras
- UVA 106 Fermat vs. Pythagoras
- UVa 106 Fermat vs. Pythagoras(毕达哥拉斯定理)
- UVa 106 - Fermat vs. Pythagoras
- UVA106- Fermat vs. Pythagoras(素勾股数)
- uva 106 Fermat vs. Pythagoras (勾股数组性质的研究)
- UVa 106 && POJ 1305 - Fermat vs. Pythagoras(毕达哥拉斯三元组)
- UVA 106 Fermat vs. Pythagoras(数论)
- UVa:106 Fermat vs. Pythagoras
- UVa 106 - Fermat vs Pythagoras(数论题目)