ACM/ICPC 之 数论-费马大定理(HNUOJ 13371)
好歹我是数学专业的学生,还是要写写训练的时候遇到的数学问题滴~~
在ACM集训的时候在各高校OJ上也遇见过挺多的数学问题,例如大数的处理,素数的各种算法,几何问题,函数问题(单调,周期等性质),甚至是各种数学定理或公式的变形。其实算法本身也属于数学研究的范畴(计算机本就是数学的衍生嘛),诸如众多排序算法,搜索算法也是许多精巧的数学逻辑思维,所以大家学计算机千万别忽视数学这门基础学科啊。
貌似说了好多废话= =||,待小编进入正题,今天在湖大OJ训练赛上看到一道数学题,话不多说,直接上图!
____________________________看不懂英语滴孩纸们好好加油啊= =,小编这种英语渣渣看这种题都没查单词(⊙o⊙)||
题目大意就是:
计算三维坐标(x,y,z)满足xj+yj == zj公式的数量,其中x,y,z都是自然数(x<=y<=z<=m),j取所有2~n范围内的整数。
分析: 我刚开始乍眼一看还以为涉及到大数乘法的相关算法,因为n可以取到100,m也可以取到100,这样想的话最大的数就有201位了= =。然后开始写代码了(好可恶的心理啊!!我居然这时候就急着写了!!),写到一半的时候就觉得很奇怪,好复杂啊~~要转成大数形式,又要乘法,还要判定相等,然后计数,估计得超时啊= =,而且如果涉及大数乘法为什么交代码的人AC百分比这么高~~。
然后再想想,这尼玛不就是很久前的著名猜想嘛,现在想想初高中涉及勾股定理的时候有做过an+bn == cn在n=2的时候就不存在正整数可以满足这个关系了。
其实这一题就是著名的费马大定理的变形(不知道的孩纸们自行百度),出题人真是照顾数学系的苦逼孩儿们啊= =
让我先给大伙儿普及数学世上的世界三大数学猜想Oo(∩_∩)oO:
- 费马猜想(费马猜想的证明于1994年由英国数学家-安德鲁·怀尔斯(Andrew Wiles)完成,称为费马大定理)
- 四色猜想(四色猜想的证明于1976年由美国数学家-阿佩尔(Kenneth Appel)与哈肯(Wolfgang Haken)借助计算机完成,称为四色定理)
- 哥德巴赫猜想(哥德巴赫猜想尚未解决,目前最好的成果(陈氏定理)乃于1966年由中国数学家陈景润取得。)
所以,我们最后能想到用枚举法枚举这几种情况可以满足上面的等式
- 枚举j==2时,所有满足这一等式的关系的情况,满足则sum++;
- 枚举x=0时,y和z相等的情况,满足则sum++;
所以我的代码如下:
1 //费马大定理 2 //Time:0 Ms 3 #include<stdio.h> 4 5 int main() 6 { 7 int m, n; 8 int x, y, z; 9 scanf("%d%d", &m, &n); 10 11 int sum = 0; 12 for (x = 0; x <= m; x++) //第一枚举-j==2情况 13 { 14 for (y = x; y <= m; y++) 15 for (z = y; z <= m; z++) 16 if (x*x + y*y == z*z) 17 sum++; 18 } 19 20 sum += (n - 2)*(m + 1); //这一关系就是第二个枚举推导的 21 printf("%d\n", sum); 22 23 return 0; 24 }
那么先这样了= =,下次再遇到再写下来分享吧
——————From 小墨