题目描述:
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
输入正整数n和k,输出一个正整数表示可能的输出数量
分析:将x和y要满足的条件提取出来
1.x<=n且y<=n
2.x%y>=k
思路1:根据上述条件可以建立循环,遍历所有的数进行寻找,理论上可以完成,但效率过低
思路2:首先将x的可能取值范围划分成若干个区间,如下表:
| 1 | 2 | ...... | y-1 | y |
| y+1 | y+2 | ...... | 2y-1 | 2y |
| ...... | ...... | ...... | ...... | ...... |
| dy+1 | dy+2 | ...... | n |
然后求出x%y的值
| 1 | 2 | ...... | y-1 | 0 |
| 1 | 2 | ...... | y-1 | 0 |
| ...... | ...... | ...... | ...... | ...... |
| 1 | 2 | ...... | n%y |
从表中可以看到,x%y的值是有规律的变化,每一行都是从1递增至y-1,然后降为0,而现在我们要做的就是从上表中找出大于等于k的值然后进行统计即可
首先忽略掉最后一行,前面每一行大于等于k的值的个数为y-1-k+1,化简后就是y-k,最后一行的第一个值为dy+1,所以前面一共有d行,即d(y-k),d的值为n/y,带入后就是(n/y)*(y-k)
最后一行主要看n%y的值和k的值的大小,n%y
最后得到的结果是(n/y)*(y-k)+n%y-k+1(n%y 代码如下: 结果如图: 完#include



