UVa 11526 H(n)

题意:

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) (数论)

posted @ 2015-02-12 17:56  AOQNRMGYXLMV  阅读(260)  评论(0编辑  收藏  举报