序列

题目描述

一个长度为k的整数序列b1,b2,...,bk(1≤b1≤b2≤...≤bk≤N)称为“好序列”当且仅当后一个数是前一个数的倍数,即bi+1是bi的倍数对任意的i(1≤i≤k-1)成立。

给定N和k,请算出有多少个长度为k的“好序列”,答案对1000000007取模。

输入输出格式

输入格式:

一行,包含2个用空格隔开的整数N和k。

输出格式:

一行,包含一个整数,表示长度为k的“好序列”的个数对1000000007取模后的结果。

输入输出样例

输入样例:
3 2
输出样例:
5

说明

样例说明:

“好序列”为:[1,1],[1,2],[1,3],[2,2],[3,3]。

数据规模:

对于40%的数据,1≤N≤30,1≤k≤10。

对于100%的数据,1≤N≤2000,1≤k≤2000。

 

思路:主要在于上一长度的序列结尾数,可以利用因子计算。

//程序名:新的C++程序
//作者: 

#include<iostream>
#include<fstream>
#include<algorithm>
#include<cmath>
using namespace std;
int ans,n,k,l[2001][51],p[2001],a[2001],sum[2001];
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)a[i]++;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=sqrt(i);j++)
        {
            if(i%j==0)
            {
                l[i][++p[i]]=j;
                if(j*j!=i)l[i][++p[i]]=i/j;
            }
        }
    }
    for(int i=1;i<k;i++)
    {
        for(int j=1;j<=n;j++)
        {
            sum[j]=0;
            for(int o=1;o<=p[j];o++)
            {
                sum[j]+=a[l[j][o]];
                sum[j]%=1000000007;
            }
        }
        for(int j=1;j<=n;j++)a[j]=sum[j];
    }
    for(int i=1;i<=n;i++)ans+=a[i],ans%=1000000007;
    cout<<ans;
    return 0;
}
View Code

 

posted @ 2019-04-22 12:47  背‘水’一栈  阅读(160)  评论(0编辑  收藏  举报