您的位置:首页 > 其它

BZOJ 1257: [CQOI2007]余数之和sum( 数论 )

2015-07-29 13:48 267 查看


n >= k 部分对答案的贡献为 k * (n - k)

n < k 部分贡献为 ∑ (k - ⌊k / i⌋ * i) = ∑ , ⌊k / i⌋ 相等的数是连续的一段, 此时这段连续的数对答案的贡献成等差数列, 可以O(1)求出..然后就分⌊k / i⌋相等的一块一块来就行了. 分出来大概是sqrt(k)块.这个sqrt(k)我并不会证Orz...写了个程序验证了一下, 分出来的块数和2 * sqrt(k)非常接近. 所以时间复杂度为O(sqrt(k))

-------------------------------------------------------------------------

#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll ans = 0; int n, k; cin >> n >> k; if(n >= k) { ans = ll(k) * (n - k); n = k - 1; } for(int L = 1; L <= n; L++) { int t = k / L, R = t ? k / t : n; if(R > n) R = n; ans += ll(k) * (R - L + 1) - ll(t) * (L + R) * (R - L + 1) / 2; L = R; } cout << ans << "\n"; return 0;}-------------------------------------------------------------------------

1257: [CQOI2007]余数之和sum

Time Limit: 5 Sec Memory Limit: 162 MB
Submit: 2417 Solved: 1113
[Submit][Status][Discuss]

Description

给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如j(5, 3)=3 mod 1 + 3 mod 2 + 3 mod 3 + 3 mod 4 + 3 mod 5=0+1+0+3+3=7

Input

输入仅一行,包含两个整数n, k。

Output

输出仅一行,即j(n, k)。

Sample Input

5 3

Sample Output

7

HINT

50%的数据满足:1<=n, k<=1000 100%的数据满足:1<=n ,k<=10^9

Source

数论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: