题解 UVA11526 【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;
}
的值。
多组数据。
思路
很明显,直接模拟题目给出的函数会 TLE。
我们理解一下题目给的代码,其实就是求
此时,我们需要引入算法:整除分块(又称数论分块、除法分块)。此算法可以快速求出形如 的式子,在数论题目中有着广泛的用途。
对于一些情况,一段数满足 这时候我们把这个值重复地加了几遍,浪费了时间。
我们可由向下取整的性质得:
化简得
所以对于上面这 个相同的数它们的和为
分析一下时间复杂度,发现时间复杂度即对于 ,所有的 的取值数量,可以知道, 可以取得 这 种取值,即时间复杂度为 。
注意此题轻微卡常。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
}
inline int h(int n){
if(!n){
return 0;
}
int res=0,j;
for(register int i=1;i<=n;i=j+1){
j=n/(n/i);
res+=(j-i+1)*(n/i);
}
return res;
}
signed main(){
int t,n;
t=read();
while(t--){
n=read();
printf("%lld\n",h(n));
}
return 0;
}
再见 qwq~
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)