码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 11526 H(n)

时间:2015-02-12 19:48:38      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

题意:

long long H(int n){
  long long res = 0;
  for( int i = 1; i <= n; i=i+1 ){
    res = (res + n/i);
  }
  return res;
}

求这样一个函数的值。

分析:

这个题很像我做莫比乌斯反演时的一个分块加速的优化。

注意到n/i的整数部分,有许多重复的数。具体一点,对于某一个i,在区间[i, n / (n / i)]中n/i的值是一样的。

例如在[17, 20]中的i,100/i的值都是5.

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int T;
 8     long long n;
 9     scanf("%d", &T);
10     while(T--)
11     {
12         scanf("%lld", &n);
13         long long ans = 0;
14         for(long long i = 1, j; i <= n; i = j+1)
15         {
16             j = n / (n / i);
17             if(j > n) j = n;
18             ans += (j-i+1) * (n/i);
19         }
20         printf("%lld\n", ans);
21     }
22 
23     return 0;
24 }
代码君

 

找到一份更快的代码,但是题解看得十分不懂,一头雾水,=_=||

UVa 11526 H(n) (数论)

UVa 11526 H(n)

标签:

原文地址:http://www.cnblogs.com/AOQNRMGYXLMV/p/4288652.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!