Fermat vs. Pythagoras
Time Limit: 2000MS | Memory Limit: 10000K | |
Total Submissions: 1105 | Accepted: 641 |
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).
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
本原勾股数:
概念:一个三元组(a,b,c),其中a,b,c没有公因数而且满足:a^2+b^2=c^2
首先,这种本原勾股数的个数是无限的,而且构造的条件满足:
a=s*t,b=(s^2-t^2)/2,c=(s^2+t^2)/2
其中s>t>=1是任意没有公因数的奇数!
由以上概念就可以导出任意一个本原勾股数组。
#include "stdio.h" #include <math.h> int n; int s,t; int temp ; int a , b ,c; int count,countP; bool flag[1000001]; int gcd(int s ,int t) { if(t==0) return s; else gcd(t,s%t); } int main() { while(scanf("%d",&n)!=EOF) { temp = sqrt(n); count = 0; countP = 0 ; int i ,j; for(s = 1 ; s <=n ; s++) flag[s]=true; for(s = 3 ; s<=temp*2; s+=2) { for(t = 1 ; t<s ; t+=2) { if(gcd(s,t)!=1) continue; c = (s*s+t*t)/2; if(c>n) break; a = (s*s-t*t)/2; b = s*t; for(i = 1 ; i<=n/c;i++) { flag[a*i]=false; flag[b*i]=false; flag[c*i]=false; } count++; } } for(s = 1 ; s<=n ; s++) if(flag[s]==1) countP++; printf("%d %d\n" , count , countP); } }