1 条题解

  • 0
    @ 2026-5-4 15:29:08

    我们定义 dp[i][j]\text{dp}[i][j] 为长度为 ii 且以 jj 结尾的好序列的数量。

    jj 的因子为 x1,x2,,xlx_1, x_2, \dots, x_l。那么有:

    $$\text{dp}[i][j] = \sum_{t=1}^{l} \text{dp}[i-1][x_t] $$

    这种方法的时间复杂度为 O(nkn)O(nk \sqrt{n}),不够快。但可以利用以下事实:下面的循环可以在 O(nlogn)O(n \log n) 时间内运行,从而得到一个 O(nklogn)O(nk \log n) 的解法,足够通过所有测试。

    for (int i = 1; i <= n; i++)          // 从 1 到 n 循环
        for (int j = i; j <= n; j += i)   // 遍历所有 i 的倍数,且不超过 n
    
    #include<iostream>
    int t,n,ans,dp[2016][2016],M=1e9+7,i,j,k;
    int main(){
    std::cin>>n>>t;dp[0][1]=1;
    for(i=1;i<=t;i++)for(j=1;j<=n;j++)for(k=j;k<=n;k+=j)(dp[i][k]+=dp[i-1][j])%=M;
    for(i=1;i<=n;i++)(ans+=dp[t][i])%=M;std::cout<<ans;
    }
    
    
    • 1

    信息

    ID
    6806
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    2
    已通过
    1
    上传者