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

你可能感兴趣的:(uva)