UVa 1363 Joseph's Problem (等差数列)
Posted forth
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 1363 Joseph's Problem (等差数列)相关的知识,希望对你有一定的参考价值。
题目
题目大意
输入正整数(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
", ans);
}
return 0;
}
以上是关于UVa 1363 Joseph's Problem (等差数列)的主要内容,如果未能解决你的问题,请参考以下文章
UVA 1363 Joseph's Problem 找规律+推导 给定n,k;求k%[1,n]的和。