任意一个正整数都可以表示为 ( 为商,为余数) 的方式,现在死脑筋的牛牛想要计算对于小于等于的每一个数, 计算所有 的和。(由于答案可能过大,请对取模)
任意一个正整数都可以表示为 ( 为商,为余数) 的方式,现在死脑筋的牛牛想要计算对于小于等于的每一个数, 计算所有 的和。(由于答案可能过大,请对取模)
1
0
1 = 1*1 + 0
5
5
5=1*5+0 , 5=2*2+1, 5=3*1+2,5=4*1+1,5=5*1+0 ;ans =5*0+2*1+1*2+1*1+1*0= 5
/** >>> when p=1...N => ans = sum{ [ n/p ] * [ n%p ] } = sum{ [ n/p ] * (n - [ n/p ] * p ) } >>> when p=[a...b) let M = [n/p]. => ans_part = sum{ M * (N - M * p) } => ans_part = sum{ MN - MM * p } let c=count{[a...b)} => ans_part = MNC - MM * sum{p} ans = sum{ ans_part } */ class Solution { public: const long long BN = 1000000007; long long cowModCount(long long n) { // write code here long long sum = 0; long long a = n; do { long long m = n / a; long long b = n / (m+1); long long c = (a - b); // a > b long long sum_p = c * (a + b + 1) >> 1; // a + ... + (b+1) long long sum0 = m * n * c - m * m * (sum_p % BN); sum += (sum0 % BN); sum %= BN; a = b; } while(a > 0); return sum; } };思路:求和、算式变形、分段求和