题目描述:牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
输入描述:输入包括两个正整数n,k(1 <= n <= 10^5, 0 <= k <= n - 1)。
输出描述:对于每个测试用例, 输出一个正整数表示可能的数对数量。
我的思路:这道题的思路就是依次求n到1分别与n到1的余数是否大于等于k,用两个循环嵌套,不过嵌套可以进行加速,不用 n--来进行迭代,比如如果x%y大于等于k,则接下来的x至x%y-k+1个数,他们与y的余数肯定也是大于等于k的,其次如果x%y小于k,则接下来 x%y+1个数他们与y的余数也是小于k的,所以这块只要比较依次就可以了;这样速度就变快了;
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
ll x, y, n, k;
cin >> n >> k;
ll flag = 0;
if (k == 0)
{
cout << (ll) n*n << endl;
}
else
{
for (ll i = n; i > 0;)
{
y = i;
for (ll j = n; j > 0;)
{
x = j;
if (x%y >= k&&x > 0)
{
flag += x%y - k + 1;
j -= (x%y-k+1);
}
else if (x%y < k&&x>0)
{
j -= (x%y + 1);
}
}
--i;
}
cout << flag << endl;
}
return 0;
}
网友评论