Fermat vs. Pythagoras
Time Limit: 2000MS |
|
Memory Limit: 10000K |
Total Submissions: 1201 |
|
Accepted: 703 |
Description
Computer generated and assisted proofs and verification occupy a small niche in the realm of Computer Science. The first proof of the four-color problem was completed with the assistance of a computer program and current efforts in verification have succeeded
in verifying the translation of high-level code down to the chip level.
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
The input consists of a sequence of positive integers, one per line. Each integer in the input file will be less than or equal to 1,000,000. Input is terminated by end-of-file
Output
For each integer N in the input file print two integers separated by a space. The first integer is the number of relatively prime triples (such that each component of the triple is <=N). The second number is the number of positive integers <=N that are not
part of any triple whose components are all <=N. There should be one output line for each input line.
Sample Input
10
25
100
Sample Output
1 4
4 9
16 27
Source
原毕达哥拉斯三元组满足:
x=m*m-n*n
y=2*m*n
i*z=m*m+n*n
其中m>n且m为奇数、n为偶数,或者m为偶数、n为奇数。
要求范围内的本原毕达哥拉斯三元组数,只需对m,n枚举即可,然后将三元组乘以i(保证i*z在所给范围内),就可以求出。
//1364K 0MS
#include<stdio.h>
#include<math.h>
#include<string.h>
bool vis[1000007];
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
void solve(int t)
{
int x,y,z,m,n,tmp=sqrt(t),ans1=0,ans2=0;
memset(vis,0,sizeof(vis));
for(n=1;n<=tmp;n++)
{
for(m=n+1;m<=tmp;m++)
{
if(m*m+n*n>t)break;
if(n%2!=m%2)
{
if(gcd(m,n)==1)
{
x=m*m-n*n;
y=2*m*n;
z=m*m+n*n;
ans1++;
for(int i=1;;i++)
{
if(i*z>t)break;
vis[i*x]=1;
vis[i*y]=1;
vis[i*z]=1;
}
}
}
}
}
for(int i=1;i<=t;i++)
if(!vis[i])ans2++;
printf("%d %d\n",ans1,ans2);
}
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
solve(t);
}
return 0;
}
POJ 1305 Fermat vs. Pythagoras 解原毕达哥拉斯三元组
原文:http://blog.csdn.net/crescent__moon/article/details/19330313