UVa 11526 - H(n)
2018-02-11 13:06
197 查看
题意
习题10-13 H(n)(H(n), UVa11526)输入n(在32位带符号整数范围内),计算下面C++函数的返回值:long long H(int n) { long long res = 0; for( int i = 1; i <= n; i=i+1 ){ res = (res + n/i); } return res;
思路
longlong的范围, 按照题给肯定超时因为取得的是整数, 则必然有几段区间内的n/i是相同的
找数举例, 一点点找规律, 瞎搞了一一个出来, 本来觉得5000ms还好交一发试试, 但还是TLE了..
long long H(int n){ long long res = 0; for( int i = 1; i <= n; i++ ){ if( n/i == 5 ){ // n/i < 6 res += 4*(n/30+1); i += n/30; continue; } else if( n/i == 4 ){ // n/i < 5 res += 4*(n/20+1); i += n/20; continue; } else if( n/i == 3 ){ // n/i < 4 res += 3*(n/12+1); i += n/12; continue; } else if( n/i == 2 ){ // n/i < 3 res += 2*(n/6+1); i += n/6; continue; } else if( n/i == 1 ){ // n/i < 2 res += n - i + 1; break; } else res += n/i; } return res+1; }
后来发现这里比如n/20, n/12, n/6…其实就是n/(4*5), n/(3*4), n/(2*3)…..
推得
res += i*(n/i-n/(i+1));
AC代码
#include <cstdio> using namespace std; long long H(int n){ long long res = 0; for( int i = 1; i <= n; i++ ){ res += i*(n/i-n/(i+1)); if(n/i - n/(i+1) <= 1){ i = n/(i+1); while( i >= 1 ){ res += n/i; i--; } break; } } return res; } int main() { int T, n; scanf("%d",&T); while(T--){ scanf("%d",&n); printf("%lld\n",H(n)); } return 0; }
相关文章推荐
- 【数论】UVa 11526 - H(n)
- uva 11526 H(n)(公式优化)
- uva 11526计算n/1+n/2+...+n/n(整除)
- [UVA 11526]H(n)[数学]
- UVa 11526 H(n) (数论)
- UVA - 11526(a/b式子计算)
- H(n)(Uva 11526)
- UVA-11526H(n)(数论)
- UVA 11526 H(n)
- UVA 11526 H(n)
- UVa 11526 - H(n)
- uva 11526 H(n) (数论)
- UVa 11526 H(n)
- Uva-11526 H(n)
- uva 11526 H(n)
- UVA 11526(p344)----H(n)
- UVA 11526 - H(n)
- UVa 11526 - H(n)
- H(n) UVA - 11526
- uva 11526