POJ-1305(勾股定理)(Fermat vs. Pythagoras)
来源:互联网 发布:君子不器 知乎 编辑:程序博客网 时间:2024/04/29 12:41
这个题目就是找在1~N之间互质的三个正整数x、y、z,并满足x^2+y^2=z^2,判断这样的数有多少对,以及跟1~N中与这些互质正整数无关的正整数的个数。
其实比较关键的是对上面那个式子 x^2+y^2=z^2 进行变形,减少一个变量为
(r^2-s^2)^2 + (2*r*s)^2 = (r^2+s^2)^2,
这样只有两个变量存在,可以减少一轮循环。于是题目就变成了找这样的r和s,当r*r + s*s <= n时,
z = r*r + s*s;
y = max(r*r - s*s, 2*r*s);
x = min(r*r - s*s, 2*r*s);
其实比较关键的是对上面那个式子 x^2+y^2=z^2 进行变形,减少一个变量为
(r^2-s^2)^2 + (2*r*s)^2 = (r^2+s^2)^2,
这样只有两个变量存在,可以减少一轮循环。于是题目就变成了找这样的r和s,当r*r + s*s <= n时,
z = r*r + s*s;
y = max(r*r - s*s, 2*r*s);
x = min(r*r - s*s, 2*r*s);
此时,如果x、y、z互质,满足条件的正整数组计数就加1,同时把所有与这些数相关的数组位标记为1
#define MAXN 1000000int flag[MAXN + 5];int ans;int gcd(int a, int b){ return b == 0 ? a : gcd(b, a % b);}void process(int value){ int i, j; for (j = 1; j * j <= value; ++j) { int minj = j - 1;//MY_MIN(sqrt(value * 1.0 - j * j) + 1, j - 1); for (i = 1; i <= minj; ++i) { if (gcd(i, j) == 1) { int x = j * j - i * i;if (x <= 0) break; int y = 2 * i * j; int z = j * j + i * i; if (x <= value && y <= value && z <= value) { if (gcd(gcd(x, y), z) == 1) ++ans; } else break; int times = 1; while (x * times <= value && y * times <= value && z * times <= value) { flag[x * times] = flag[y * times] = flag[z * times] = 1; ++times; } } } }}int main(){ int n; while (cin>>n) { ans = 0; memset(flag, 0, sizeof(flag)); int i; int sum = 0; process(n); for (i = 0; i <= n; ++i) if (flag[i]) ++sum; printf("%d %d\n", ans, n - sum); } return 0;}
- POJ-1305(勾股定理)(Fermat vs. Pythagoras)
- POJ 1305:Fermat vs. Pythagoras - 勾股定理/毕达哥拉斯三元组
- POJ 1305 Fermat vs. Pythagoras (构造 毕达哥拉斯三元组)
- POJ 1305 Fermat vs. Pythagoras (本原毕达哥拉斯三元组)
- POJ 1305 Fermat vs. Pythagoras
- POJ 1305 Fermat vs. Pythagoras
- poj 1305 Fermat vs. Pythagoras
- POJ.Fermat vs. Pythagoras
- poj 1305——Fermat vs. Pythagoras
- POJ 1305 Fermat vs. Pythagoras(勾股数)
- POJ 1305 Fermat vs. Pythagoras 笔记
- POJ-1305-Fermat vs. Pythagoras-(本原勾股数)
- UVa 106 && POJ 1305 - Fermat vs. Pythagoras(毕达哥拉斯三元组)
- POJ 1305-Fermat vs. Pythagoras(本原的毕达哥拉斯三元组+枚举)
- uva 106 - Fermat vs. Pythagoras(素勾股数)
- UVA106- Fermat vs. Pythagoras(素勾股数)
- UVA106 - Fermat vs. Pythagoras(素勾股数)
- UVA 106 Fermat vs. Pythagoras(勾股数)
- 运用jquery产生上中下对话框
- [Testing] 软件测试工程师需要掌握的知识.
- 静电电压高达上万伏原理分析
- Android 用户界面---拖放(Drag and Drop)(二)
- 九九乘法表
- POJ-1305(勾股定理)(Fermat vs. Pythagoras)
- 鼠标文字背景
- 6种排序算法:冒泡、鸡尾酒、选择、插入、归并、快速
- Android系统文件夹结构介绍
- VMare Tools的安装
- extjs $ 美元符号修改
- 若柯嫩师长教师能考与邦际证照
- JavaScript获取系统当前日期和时间、星期几
- Discuz! X2 后台有没有自己设置安全提问的地方?