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 }

猜你喜欢

转载自www.cnblogs.com/hkxy125/p/9637398.html