题意:
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 ", ans); 21 } 22 23 return 0; 24 }
找到一份更快的代码,但是题解看得十分不懂,一头雾水,=_=||