第一篇题解

· · 题解

题目直通车

其他大佬的题解

这题像我这样的菜鸟第一眼也看的出来暴力会超时,楼上大佬的题解使用数学方法做的 (虽然也会,但懒得写)。我这里只讲用暴力过全对的方法。

1.简化题意

做题总要清楚题目讲什么,要求什么:
给定 n, m,问是否存在两个不同的数 x,y 使得 1 \le x < y \le m 且 n \bmod x = n \bmod y 。

我们可以提炼出精髓:是否满足 n \bmod x = n \bmod y 的条件。

2.思考算法

1.暴力
2.数学

开始的时候也说了数学方法不讲,数学方法不适合初学者。

题目中有四个变量,两个已知,两个未知。我们只需枚举未知的两个变量就行了。当然这里有些同学这样写 (就是我的学生...)

for(int i=1;i<=m;i++)
    for(int j=1;j<=m;j++)

这次的简化题意里我一字不差的把题目描述抄了过来,题目清楚地说了 1 \le x < y \le m 是 x < y !写for(int j=1;j<=m;j++)的用户快改过来。应为for(int j=i+1;j<=m;j++)

3.提升算法

你先写出超时代码,再去试试 m \le 15 的数你就会发现规律。

具体代码不展示!我认为清楚算法应该自己去写程序,经历编写调试的过程(《深入浅出程序设计竞赛·基础篇》就明确说明了编写调试的过程)你写不出可以在讨论发表,AT我。你只要有这个过程就行了,你不写,去抄根本看不懂的题解,就是做无用功。