专栏文章

题解:P1028 [NOIP 2001 普及组] 数的计算

P1028题解参与者 12已保存评论 12

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
12 条
当前快照
1 份
快照标识符
@miq67r9a
此快照首次捕获于
2025/12/03 23:37
3 个月前
此快照最后确认于
2025/12/03 23:37
3 个月前
查看原文
fif_i 表示当 n=in=i 时的答案,则 fi=f1+f2++fn/2+1f_i=f_1+f_2+\ldots+f_{\left\lfloor n/2\right\rfloor}+1(因为 n=in=i 时,序列的第一个数为 ii),初始时 f1=1f_1=1
直接循环递推求解是 O(n2)O(n^2) 的,虽然可以通过本题,我们考虑优化。
gi=f1+f2++fig_i=f_1+f_2+\cdots+f_i,则转移为 fi=gn/2+1f_i=g_{\left\lfloor n/2\right\rfloor}+1 即可,这样做时间复杂度是 O(n)O(n) 的。
CPP
#include<iostream>
#include<algorithm>
const int sz=1010;
int f[sz],g[sz];
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    int n;
    std::cin>>n;
    f[1]=g[1]=1;
    for(int i=2;i<=n;i++)f[i]=g[i/2]+1,g[i]=g[i-1]+f[i];
    std::cout<<f[n]<<"\n";
    return 0;
}

评论

12 条评论,欢迎与作者交流。

正在加载评论...