首页 > 其他 > 详细

UVa 1363 Joseph's Problem (等差数列)

时间:2018-09-29 16:22:07      阅读:114      评论:0      收藏:0      [点我收藏+]

题目

题目大意

输入正整数\(n\)\(k\)(\(1 ≤ n, k ≤ 10^9\)), 计算\(\sum_{i = 1}^{n}k\ mod\ i\)

题解

被除数固定, 除数逐次加\(1\), 直观上余数也应该有规律: 对于某一个区间\(i, i + 1, i + 2, \cdots , j\), 如果\(k\)除以它们的商的整数部分都相同, 则\(k\)除以它们的余数会是一个等差数列。

这样就就可以在枚举\(i\)的时候把它所在的等差数列之和累加到答案中, 大大降低了时间复杂度。

代码

#include <cstdio>
#include <algorithm>
long long n, k;
long long ans, i;
int main(int argc, char const *argv[]) {
  while (~scanf("%lld %lld", &n, &k)) {
    ans = std::max(n - k, 0ll) * k, i = 1;
    for (register long long l, r; i * i <= k; ++i) {
      l = k / (i + 1) + 1,
      r = std::min(n, k / i);
      if (l <= r) {
        ans += ((k % r + k % l) * (r - l + 1)) >> 1;
      }
    }
    for (i = std::min(n, k / i); i; --i) ans += k % i;
    printf("%lld\n", ans);
  }
  return 0;
}

UVa 1363 Joseph's Problem (等差数列)

原文:https://www.cnblogs.com/forth/p/9724287.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!