码迷,mamicode.com
首页 > 其他好文 > 详细

数论(毕达哥拉斯定理):POJ 1305 Fermat vs. Pythagoras

时间:2016-03-18 21:34:35      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:

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 }

 



  

数论(毕达哥拉斯定理):POJ 1305 Fermat vs. Pythagoras

标签:

原文地址:http://www.cnblogs.com/TenderRun/p/5293479.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!