UVa 1363 - Joseph's Problem(数论)

链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4109

题意:

输入正整数n和k(1≤n,k≤1e9),计算sum(k mod i)(1≤i≤n)。

分析:

被除数固定,除数逐次加1,直观上余数也应该有规律。假设k/i的整数部分等于d,则k mod i = k-i*d。
因为k/(i+1)和k/i差别不大,如果k/(i+1)的整数部分也等于d,
则k mod (i+1) = k - (i+1)*d = k-i*d - d = k mod i - d。
换句话说,如果对于某一个区间i, i+1, i+2,…, j,
k除以它们的商的整数部分都相同,则k除以它们的余数会是一个等差数列。
这样,可以枚举d并把相应的等差数列之和累加到答案中,再简单讨论一下其他情况即可。

代码:

 import java.io.*;
import java.util.*;
import static java.lang.Math.*; public class Main {
Scanner cin = new Scanner(new BufferedInputStream(System.in)); void MAIN() {
while(cin.hasNext()) {
long n = cin.nextLong();
long k = cin.nextLong();
long d = 1, ans = max(n-k,0)*k;
for(; d * d <= k; d++) {
long R = min(n, k/d);
long L = k / (d+1) + 1;
if(L > R) continue;
ans += (k%R + k%L) * (R-L+1) / 2;
}
for(d = min(n,k/d); d >= 1; d--) ans += k%d;
System.out.println(ans);
}
} public static void main(String args[]) { new Main().MAIN(); }
}
上一篇:WEBBROWSER中模拟鼠标点击(SendMessage/PostMessage)


下一篇:LA 3521 Joseph's Problem