您的位置:首页 > Web前端

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 互质

非本原勾股数只需乘上一个系数即可

#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: