Fermat vs. Pythagoras
Time Limit: 2000MS | Memory Limit: 10000K | |
Total Submissions: 1493 | Accepted: 865 |
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 题意:给定一个n,输出三元组(a,b,c)其中a,b,c两两互质,且a²+b²=c²,以及1~n中没有在任何一个三元组中出现过的数的个数。 这道题需要知道勾股数的性质。 首先,对于一组勾股数,①a与b的奇偶性不同,②c一定为奇数。 证明①:若a与b同为偶数,则c也为偶数,与a,b,c两两互质矛盾;若a与b同为奇数,c一定为偶数,设a=2*i+1,b=2*j+1,c=2*k -> a²+b²=c²->2*i²+2*i+2*j²+2*j+1=2*k²,这个式子是矛盾的。 证明②:a,b一奇一偶,显然。 然后将 a²+b²=c² 变形,a²=(c+b)*(c-b),容易发现c-b与c+b互质,所以c-b与c+b都是平方数,设x²=c-b,y²=c+b,得a=x*y,b=(y²-x²)/2,c=(y²+x²)/2. 易得x,y都为奇数,直接枚举x,y就好了。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cmath> 5 using namespace std; 6 const int maxn=1000010; 7 bool vis[maxn]; 8 long long Gcd(long long a,long long b){ 9 return b?Gcd(b,a%b):a; 10 } 11 int main(){ 12 int n,m,ans,tot; 13 while(~scanf("%d",&n)){ 14 m=(int)sqrt(n+0.5);ans=tot=0; 15 memset(vis,0,sizeof(vis)); 16 for(int t=1;t<=m;t+=2) 17 for(int s=t+2;(s*s+t*t)/2<=n;s+=2) 18 if(Gcd(s,t)==1){ 19 int a=s*t; 20 int b=(s*s-t*t)/2; 21 int c=(s*s+t*t)/2 22 ans++; 23 for(int k=1;k*c<=n;k++){ 24 vis[k*a]=true; 25 vis[k*b]=true; 26 vis[k*c]=true; 27 } 28 } 29 for(int i=1;i<=n;i++) 30 if(!vis[i]) 31 tot++; 32 printf("%d %d\n",ans,tot); 33 } 34 }