毕达哥斯拉三元组,即勾股数组。
勾股数组参考资料:http://blog.youkuaiyun.com/magicnumber/article/details/6410043
s的取值范围:3≤s≤√(2n-1),假设t取最小值,s就是这个范围。具体请查看参考资料。
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
const int MAXN = 1000100;
bool vis[MAXN];
int gcd(int a, int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int n,a,b,c,res,cnt;
while(~scanf("%d",&n))
{
res = cnt = 0;
memset(vis,0,sizeof(vis));
int m = sqrt(2*n);
for(int t = 1; t <= m; t += 2)
{
for(int s = t+2; s <= m; s += 2)
{
if(gcd(s,t) != 1) continue;
a = s*t;
b = (s*s-t*t)/2;
c = (s*s+t*t)/2;
if(c > n) break;
if(a*a + b*b != c*c)
continue;
++res;
for(int k = 1; k*c <= n; ++k)
vis[k*a] = vis[k*b] = vis[k*c] = true;
}
}
for(int i = 1; i <= n; ++i)
if(!vis[i])
++cnt;
printf("%d %d\n",res,cnt);
}
return 0;
}