zoukankan      html  css  js  c++  java
  • 序列中找子序列的dp

    题目网址: http://codeforces.com/problemset/problem/414/B

    Description

    Mashmokh's boss, Bimokh, didn't like Mashmokh. So he fired him. Mashmokh decided to go to university and participate in ACM instead of finding a new job. He wants to become a member of Bamokh's team. In order to join he was given some programming tasks and one week to solve them. Mashmokh is not a very experienced programmer. Actually he is not a programmer at all. So he wasn't able to solve them. That's why he asked you to help him with these tasks. One of these tasks is the following.

    A sequence of l integers b1, b2, ..., bl(1 ≤ b1 ≤ b2 ≤ ... ≤ bl ≤ n) is called good if each number divides (without a remainder) by the next number in the sequence. More formally  for all i(1 ≤ i ≤ l - 1).

    Given n and k find the number of good sequences of length k. As the answer can be rather large print it modulo 1000000007(109 + 7).

    Input

    The first line of input contains two space-separated integers n, k (1 ≤ n, k ≤ 2000).

    Output

    Output a single integer — the number of good sequences of length k modulo 1000000007(109 + 7).

    Sample Input

    Input
    3 2
    Output
    5
    Input
    6 4
    Output
    39
    Input
    2 1
    Output
    2

    Hint

    In the first sample the good sequences are: [1, 1], [2, 2], [3, 3], [1, 2], [1, 3].

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    
    using namespace std ;
    const int N=2010;
    const int mod=1e9+7;
    int dp[N][N];        //dp[i][j]表示长度为i,最后一个元素为j的序列数。
    
    int main()
    {
        int n,k;
        while(cin>>n>>k)
        {
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
            dp[1][i]=1;
            for(int t=1;t<k;t++)
            {
                for(int i=1;i<=n;i++)
                {
                    for(int j=1;i*j<=n;j++)
                    {
                        dp[t+1][i*j]+=dp[t][i];//从i=1循环到n,i*j即凡是i的倍数的dp值均加上上一行(序列长度少一)的dp[t][i]值。
                        dp[t+1][i*j]%=mod;
                    }
                }
            }
            int set=0;
            for(int i=1;i<=n;i++)
            {
                set+=dp[k][i];
                set%=mod;
            }
            cout<<set<<endl;
        }
        return 0 ;
    }
  • 相关阅读:
    Lambda表达式、依赖倒置
    ASP.NET vNext 概述
    Uname
    RHEL4 i386下安装rdesktop【原创】
    Taxonomy of class loader problems encountered when using Jakarta Commons Logging(转)
    How to decompile class file in Java and Eclipse
    先有的资源,能看的速度看,不能看的,抽时间看。说不定那天就真的打不开了(转)
    Google App Engine 学习和实践
    【VBA研究】VBA通过HTTP协议实现邮件轨迹跟踪查询
    js正則表達式语法
  • 原文地址:https://www.cnblogs.com/chen9510/p/5017197.html
Copyright © 2011-2022 走看看