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 MBSubmit: 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=7Input
输入仅一行,包含两个整数n, k。Output
输出仅一行,即j(n, k)。Sample Input
5 3Sample Output
7HINT
50%的数据满足:1<=n, k<=1000 100%的数据满足:1<=n ,k<=10^9Source
数论相关文章推荐
- 用java做了个控制台版的2048
- MySql 索引
- C# 导入EXCEL 报错外部表不是预期的格式错误
- Painter(模拟)
- bzoj2705
- Spiral Matrix II
- Android-给照片底部添加波浪效果
- 移动H5前端性能优化指南
- JAVA
- ionic开发插件之ngCordova配置安装
- Android 动画之RotateAnimation应用详解
- linux 内存管理
- 测试live writer
- linux下搭建 FastDFS + Nginx
- GBK转UTF-8时,奇数个中文会乱码,偶数个中文不会乱码
- python 操作mysql数据库demo
- iOS实现弹幕功能
- 单链表排序
- android Smali注入
- python 操作mysql数据库demo