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 小墨

posted @ 2015-08-08 20:14  文字失效  阅读(1358)  评论(0编辑  收藏  举报