Description
This problem deals with computing quantities relating to part of Fermat's Last Theorem: that there are no integer solutions of a^n + b^n = c^n for n > 2.
Given a positive integer N, you are to write a program that computes two quantities regarding the solution of x^2 + y^2 = z^2, where x, y, and z are constrained to be positive integers less than or equal to N. You are to compute the number of triples (x,y,z) such that x < y < z, and they are relatively prime, i.e., have no common divisor larger than 1. You are also to compute the number of values 0 < p <= N such that p is not part of any triple (not just relatively prime triples).
Input
Output
Sample Input
10 25 100
Sample Output
1 4 4 9 16 27
//
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
///x=2*a*b,y=a^2-b^2,z=a^2+b^2,其中a>b>0,(a,b)=1,a和b有不同的奇偶性。
int vis[1000001];
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int n;
while(scanf("%d",&n)==1)
{
memset(vis,0,sizeof(vis));
int tot=0;
for(int i=1;i<=int(sqrt(n/2.0));i++)
{
for(int j=i+1;j<=int(sqrt(n/1.0));j++)
{
if(!(gcd(i,j)==1&&(i%2!=j%2))) continue;
int x=j*j-i*i;
int y=2*j*i;
int z=i*i+j*j;
if (z>n) break;
if (gcd(x,y)==1&&gcd(x,z)==1&&gcd(y,z)==1)
{
tot++;
for (int k=1;k<=n/z;k++)
vis[x*k]=vis[y*k]=vis[z*k]=1;
}
}
}
int tt=0;
for(int i=1;i<=n;i++) if (vis[i]==0) tt++;
printf("%d %d\n",tot,tt);
}
return 0;
}