UVA106 - Fermat vs. Pythagoras
假设x为奇数,y为偶数,则z为奇数,2z与2x的最大公因数为2,2z和2x可分别写作
- 2z = (z + x) + (z - x)
- 2x = (z + x) - (z - x)
那么跟据最大公因数性质,z + x和z - x的最大公因数也为2,又因为:
- (z + x)(z - x) = y2,两边同除以4得:
((z + x) / 2)((z - x) / 2) = (y / 2)2
故可令:
- z + x = 2m2, z - x = 2n2
其中z = m + n, x = m - n(m与n互质)
则有:
- y2 = z2 - x2 = 2m22n2 = 4m2n2
即y = 2mn。
综上所述,可得到下式:
- x = m2 - n2, y = 2mn, z = m2 + n2. (m, n为任意自然数)
这里还有一个问题:题目要求统计(x, y, z)三元组的数量时只统计x,y和z两两互质的的情况,这个问题用上面的算法就可以解决了。但对于统计p的数量,题目并不限定三元组是两两互质的。但是上式不能生成所有x, y, z并不是两两互质的情况。然而假设x与y最大公因数w不为1,则z也必能被w整除,因此w为x, y, z三个数的公因数。归纳总结可知,所有非两两互质的x0, y0, z0都可由一组互质的x, y, z乘以系数得到。根据以上理论就可以快速的求解了。
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #define MAX 1000010
- using namespace std;
- bool vis[MAX];
- int prime[MAX][],n;
- int gcd(int a, int b)
- {
- return b == ? a : gcd(b, a%b);
- }
- int upper(int l, int r, int v)
- {
- int m;
- while (l < r)
- {
- m = l + (r - l) / ;
- if (prime[m][] <= v) l = m + ;
- else r = m;
- }
- return r;
- }
- int cmp(const void*a, const void*b)
- {
- return ((int*)a)[] - ((int*)b)[];
- }
- int main()
- {
- int i,j,z,x,y,k=;
- int imax = int(sqrt(MAX >> )+0.5),jmax;
- for (i = ; i <= imax; i++)
- {
- jmax = int(sqrt(MAX - i*i) + 0.5);
- for (j = i + ; j <= jmax; j++)
- if ((i & ) + (j & )== && gcd(i, j) == )//(i&1)+(j&1)==1 一奇一偶
- {
- y = * i*j;
- z = i*i + j*j;
- x = j*j - i*i;
- if (x*x+y*y==z*z&&z<=)
- {
- prime[k][] = x;
- prime[k][] = y;
- prime[k++][] = z;
- }
- }
- }
- qsort(prime,k,sizeof(prime[]),cmp);
- while (scanf("%d", &n) == )
- {
- int a = upper(, k, n);
- memset(vis, , n + );
- for (i = ; i < a; i++)
- for (j = ; j*prime[i][] <= n; j++)
- {
- vis[j*prime[i][]] = ;
- vis[j*prime[i][]] = ;
- vis[j*prime[i][]] = ;
- }
- int count = ;
- for (i = ; i <= n; i++)
- if (!vis[i]) count++;
- printf("%d %d\n", a, count);
- }
- return ;
- }
UVA106 - Fermat vs. Pythagoras的更多相关文章
- UVa 106 - Fermat vs Pythagoras(数论题目)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- 数论(毕达哥拉斯定理):POJ 1305 Fermat vs. Pythagoras
Fermat vs. Pythagoras Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 1493 Accepted: ...
- POJ 1305 Fermat vs. Pythagoras (毕达哥拉斯三元组)
设不定方程:x^2+y^2=z^2若正整数三元组(x,y,z)满足上述方程,则称为毕达哥拉斯三元组.若gcd(x,y,z)=1,则称为本原的毕达哥拉斯三元组. 定理:正整数x,y,z构成一个本原的毕达 ...
- Fermat vs. Pythagoras POJ - 1305 (数论之勾股数组(毕达哥拉斯三元组))
题意:(a, b, c)为a2+b2=c2的一个解,那么求gcd(a, b, c)=1的组数,并且a<b<c<=n,和不为解中所含数字的个数,比如在n等于10时,为1, 2, 7,9 ...
- Uva 106 - Fermat vs. Pythagoras 解题报告
数论题,考查了本原勾股数(PPT) 对一个三元组(a,b,c)两两互质 且满足 a2 + b2 = c2 首先有结论 a 和 b 奇偶性不同 c总是奇数(可用反证法证明,不赘述) 设 a为奇数 b为偶 ...
- poj1305 Fermat vs. Pythagoras(勾股数)
题目传送门 题意: 设不定方程:x^2+y^2=z^2若正整数三元组(x,y,z)满足上述方程,则称为毕达哥拉斯三元组.若gcd(x,y,z)=1,则称为本原的毕达哥拉斯三元组. 定理:正整数x,y, ...
- UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...
- 毕达哥拉斯三元组(勾股数组)poj1305
本原毕达哥拉斯三元组是由三个正整数x,y,z组成,且gcd(x,y,z)=1,x*x+y*y=z*z 对于所有的本原毕达哥拉斯三元组(a,b,c) (a*a+b*b=c*c,a与b必定奇偶互异,且c为 ...
- SDUT Fermat’s Chirstmas Theorem(素数筛)
Fermat's Chirstmas Theorem Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 In a letter ...
随机推荐
- mybatis 查询语句(按条件查询)
<select id="getAllDitch" parameterType="xxx.xx.entity.CheckDitch" resultType= ...
- WindowsAzure上把WebApp和WebService同时部署在一个WebRole中
注:本文为个人学习转载,原文地址:http://blog.csdn.net/zztfj/article/details/6740327 最近开发一个和WindowsAzure相关的应用,该应用还调用了 ...
- IOS中实例的权限控制
@public.@protected.@private的使用 在OC中声明一个类的时候,可以使用上面 @public.@protected.@private三个关键字声明实例的权限,例如下面的代码: ...
- javascript 值传递
在js中 简单类型是值传递 复杂类型是引用传递 简单类型:String Number Boolean undefined Null 复杂类型:Object 下面的代码演示这个 var simpleNa ...
- CSS设置input placeholder文本的样式
placeholder是HTML5 input的新属性,英文意思是占位符,它一般表示input输入框的默认提示值. 下面是设置placeholder的文本样式的选择器的示例: /* webkit 浏 ...
- MyBatis 基本数据类型条件判断问题
1.判断参数使用:_parameter <select id="findCount" parameterType="int" resultType=&qu ...
- json处理三部曲之第三曲:利用Gson处理json
需要导入gson-xxx.jar包 <dependency> <groupId>com.google.code.gson</groupId> <artifac ...
- shape的使用
android在布局边缘位置处理圆角的两个办法: 1),一个是直接让美工切一张带有圆角的图片. 2),使用shape来解决. 第一种不在赘述,主要讲一下第二中方法来实现. 上边缘出现圆角,下边缘正常的 ...
- html+javascript实现可拖动可提交的弹出层对话框效果
本文为大家介绍下使用html+javascript实现可拖动弹出层.对话框.可提交,具体代码如下,感兴趣的朋友可以参考下,希望对大家有所帮助 <!DOCTYPE HTML PUBLIC &quo ...
- 图像相似度计算之哈希值方法OpenCV实现
http://blog.csdn.net/fengbingchun/article/details/42153261 图像相似度计算之哈希值方法OpenCV实现 2014-12-25 21:27 29 ...