[C/C++]数对 编程刷题
参考链接
题目描述
牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
输入描述
输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。
输出描述
对于每个测试用例, 输出一个正整数表示可能的数对数量。
输入例子1:
5 2
输出例子:
7
说明:
满足条件的数对有(2,3),(2,4),(2,5),(3,4),(3,5),(4,5),(5,3)
思路:
首先,我把这道题想象的太简单,直接套了两层for循环去解决问题,结果就是超时了。
因此,我就只能想办法减少一层for循环试试看。
我又思考了x与y的关系,由于x % y >= k , 因此,y > k 。 将 k < y <= n,作为第一层循环的出口,我开始思考循环里面的判别条件。又因为取模之间是有规律可循的,大家可以画一个矩阵图来分析一下,当 x % y 的结果是在 {1,2,3,y-1,0}这个范围内循环的,所以我只要计算这个区间内有几个满足条件的x,再算一下区间的个数 + 取模结果 - k + 1就可以解决问题。
“just show my code”
代码(c++/c)
#include<iostream>
using namespace std;
typedef long long LL;
int main(){
LL n , k;
cin >> n >> k;
LL res = 0; // 可能的结果数
if (k == 0){
res = n * n;
}else{
for (LL y = k+1; y <= n; y++){
res += (n/y) * (y-k);
if (n % y - k >= 0){
res += n % y - k + 1;
}
}
}
cout<< res << endl;
return 0;
}
如果我的文章能帮你节约20秒,就请你为我的文章点个赞吧!