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并把相应的等差数列之和累加到答案中,再简单讨论一下其他情况即可。
代码:
1 import java.io.*; 2 import java.util.*; 3 import static java.lang.Math.*; 4 5 public class Main { 6 Scanner cin = new Scanner(new BufferedInputStream(System.in)); 7 8 void MAIN() { 9 while(cin.hasNext()) { 10 long n = cin.nextLong(); 11 long k = cin.nextLong(); 12 long d = 1, ans = max(n-k,0)*k; 13 for(; d * d <= k; d++) { 14 long R = min(n, k/d); 15 long L = k / (d+1) + 1; 16 if(L > R) continue; 17 ans += (k%R + k%L) * (R-L+1) / 2; 18 } 19 for(d = min(n,k/d); d >= 1; d--) ans += k%d; 20 System.out.println(ans); 21 } 22 } 23 24 public static void main(String args[]) { new Main().MAIN(); } 25 }