紫书 例题 10-25 UVa 1363(找规律)
可以发现余数是成一段一段的等差数列的。
在商数同的时候,余数是成首项为第一个数的余数,公差
为商数的等差数列。
利用这个性质求解即可。
#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
using namespace std;
long long sum(int a, int d, int n)
{
return (long long)(2 * a - n * d) * (n + 1) / 2;
}
int main()
{
int n, k;
while(~scanf("%d%d", &n, &k))
{
int i = 1;
long long ans = 0;
while(i <= n)
{
int p = k / i, q = k % i;
int cnt = n - i;
if(p > 0) cnt = min(cnt, q / p);
ans += sum(q, p, cnt);
i += cnt + 1;
}
printf("%lld\n", ans);
}
return 0;
}