题解 UVA11526 【H(n)】
刚学完整除分块的蒟蒻来写题解了
不会整除分块看这里
如果看不了(或不想看)也没关系,就在这里讲讲
这题就相当于求这个柿子:
很明显
#include<iostream>
using namespace std;
long long H(int n){
long long res=0;
for(int i=1; i<=n; ++i)
res+=n/i;
return res;
}//题目给的函数
int main()
{
long long n,t;
cin>>t;
while(t--){
cin>>n;
cout<<H(n)<<endl;
}
}
不过,提交后,惨烈的TLE了
求的是
因为是向下取整,所以有些值是一样的
比如
不难发现,这些值是像块状一样分布的
每一个值相同的块的
可以写出以下代码qwq(附解释):
那么时间复杂度呢?
解:
当
由于代码枚举了
比暴力好了许多
最后附一遍H函数的代码:
inline LL H(LL n){
res=0;
for(LL i=1;i<=n;i=j+1) j=n/(n/i),res+=(j-i+1)*(n/i);
return res;
}