LightOJ 1245 Harmonic Number (II)(∑ (n / i)(n < 2^31))
2016-05-29 11:49
453 查看
题目链接:
LightOJ 1245 Harmonic Number (II)
题意:
分析:
我只能想到ans
- ans[n - 1] = n的因子个数,剩下的我就不会了,因为n太大了,没办法递推啊。。。。。
网上是这样说的。令m = sqrt(n)。那么对于m’ > m,n/m’一定小于等于m,所以可以把结果分成两部分:
前m项和从m之后的项。前m项根据数据范围可以for循环直接跑。从m之后的项我们计算结果为i的项有多少个。显然是n/i - n/(i + 1)个。那么所有结果为i的项之和为(n/i - n/(i + 1)) * i。还要特判一下n/m == m的情况,这时相当于第二次计算时将第一次计算的n/m也计算进去了,所以要减去n/m。
其实这样看起来也蛮简单的,但是就是想不起来呀=_=!
LightOJ 1245 Harmonic Number (II)
题意:
i <= n 计算 ∑ (n / i)(n < 2^31) i = 1
分析:
我只能想到ans
- ans[n - 1] = n的因子个数,剩下的我就不会了,因为n太大了,没办法递推啊。。。。。
网上是这样说的。令m = sqrt(n)。那么对于m’ > m,n/m’一定小于等于m,所以可以把结果分成两部分:
前m项和从m之后的项。前m项根据数据范围可以for循环直接跑。从m之后的项我们计算结果为i的项有多少个。显然是n/i - n/(i + 1)个。那么所有结果为i的项之和为(n/i - n/(i + 1)) * i。还要特判一下n/m == m的情况,这时相当于第二次计算时将第一次计算的n/m也计算进去了,所以要减去n/m。
其实这样看起来也蛮简单的,但是就是想不起来呀=_=!
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <climits> #include <cmath> #include <ctime> #include <cassert> #define IOS ios_base::sync_with_stdio(0); cin.tie(0); using namespace std; typedef long long ll; int T, cases = 0; ll n; int main() { scanf("%d", &T); while(T--){ scanf("%lld", &n); int m = (int)sqrt(n + 0.5); ll ans = 0; for(int i = 1; i <= m; i++){ ans += n / i; ans += (n / i - n / (i + 1)) * i; } if(m == n / m) ans -= n / m; printf("Case %d: %lld\n", ++cases, ans); } return 0; }
相关文章推荐
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- Project Euler Problem 387 - Harshad Numbers - 深度优先
- 编程之美2015初赛A
- LightOJ 1067 Combinations 组合数取模
- 数论题集
- 原根
- 阶与原根学习笔记
- HDU 1299 Diophantus of Alexandria
- Leftmost Digit(HDU 1060)
- Rightmost Digit(HDU 1061)
- Python-在奇数中寻找素数
- ZOJ 2674 Strange Limit 欧拉定理
- LeetCode-Palindrome Number
- 组合数求模总结
- LightOJ 1004 - Monkey Banana Problem