素勾股數定理
如果m,n互質且其中一個是偶數
那麼 a = m*m - n*n
b = 2*m*n
c = m*m +n * n
(a,b,c)就是素勾股數。
所有的勾股數可以表示爲(na,nb,nc)。
#include <iostream>
#include<cstring>
#include<stdio.h>
#include<cmath>
using namespace std;
int vis[1000010];
int gcd(int a,int b)
{
return b == 0?a:gcd(b,a%b);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof vis);
int m = sqrt(n+0.5);
int ans = 0;
int p = 0;
long long a,b,c;
for(long long i = 1; i <= m; i++) //因爲每個數要小於n,b = 2*i*j所以i<=sqrt(n)
{
for(long long j = i + 1;; j+=2)//兩個數保證有且只有一個偶數
{
long long tmp = i*i+j*j;
if(tmp > n) break;
if(gcd(i,j)==1)
{
ans++;
a = j*j - i*i;
b = 2*i*j;
c = j*j + i*i;
if(!vis[a]){p++;vis[a] = 1;}
if(!vis[b]){ p++;vis[b] = 1; }
if(!vis[c]){ p++; vis[c] = 1; }
for(long long i = 2; i*c <= n; i++)
{
if(!vis[a*i]){p++;vis[a*i] = 1;}
if(!vis[b*i]){p++;vis[b*i] = 1;}
if(!vis[c*i]){p++;vis[c*i] = 1;}
}
}
}
}
printf("%d %d\n",ans,n - p);
}
return 0;
}