J、Berserker's trouble
题意:给你一个N,定义一个二元组(a,b),当a,b小于N的正整数并且a%b>=k,则认为二元组(a,b)是合法的
https://ac.nowcoder.com/acm/contest/554/J
求二元组的个数。
1、a%b>=k,考虑枚举每一个b,然后将N按照每段长度为b来分段,这样每一组内能%b>=k的数字就都是一样的,注意一下尾巴可能也有贡献
2、当k为0时,特判一下。
#include <bits/stdc++.h>
#define ll long long
int main()
{
ll n, k;
while (scanf("%lld%lld", &n, &k) > 0)
{
if (k == 0)
printf("%lld\n", n * n);
else
{
ll ans = 0;
for (int i = k + 1; i <= n; i++)
{
ans += n / i * (i - k);
if (n % i >= k)
ans += n % i - k + 1;
}
printf("%lld\n", ans);
}
}
}