您的位置:首页 > Web前端

UVA 106 Fermat vs. Pythagoras(数论)

2013-11-05 18:48 225 查看


 Fermat vs. Pythagoras 

Background

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 

 for n >
2.

The Problem

Given a positive integer N, you are to write a program that computes two quantities regarding the solution of



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 

 such that p is
not part of any triple (not just relatively prime triples).

The 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.

The 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 

 ).
The second number is the number of positive integers 

 that are not part of any triple whose components are all 

 .
There should be one output line for each input line.

Sample Input

10
25
100


Sample Output

1 4
4 9
16 27

参考了题解http://www.cnblogs.com/devymex/archive/2010/08/07/1799713.html
这题的关键在于求x,y,z值,,直接遍历O(n3)肯定超时,根据题解推出的公式转换为遍历m, n复杂度为O(n)。

代码:

#include <stdio.h>
#include <string.h>
#include <math.h>
int max(int a, int b) {return a > b ? a : b;}
const int MAXN = 1000005;
int N, n, m, num, x, y, z, vis[MAXN], ans, count;

bool judge(int m, int n) {
int a = m, b = n;
if (a < b) {
int t = b;
b = a;
a = t;
}
while (b) {
int t = b;
b = a % t;
a = t;
}
if (a == 1)
return true;
else
return false;
}
int main() {
while (~scanf("%d", &N)) {
ans = count = 0;
memset(vis, 0, sizeof(vis));
num = int(sqrt(N));
for (n = 1; n <= num; n ++)
for (m = n + 1; m <= num; m ++) {
x = m * m - n * n;
y = 2 * m * n;
z = m * m + n * n;
if (x <= N && y <= N && z <= N && judge(x, y) && judge(x, z) && judge(z, y)) {
ans ++;
int Max = max(x, max(y, z));
for (int i = 1; Max * i <= N; i ++) {
vis[x * i] = vis[y * i] = vis[z * i] = 1;
}
}
}
for (int j = 1; j <= N; j ++) {
if (!vis[j])
count ++;
}
printf("%d %d\n", ans, count);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: