洛谷 P2193 HXY和序列

来源:互联网 发布:如何运行协同过滤算法 编辑:程序博客网 时间:2024/05/29 16:47

洛谷 P2193 HXY和序列


题目

题目描述

HXY突发奇想,她想要找到一个正整数序列,满足序列中所有的数不超过n,序列长度为p,且除了第一个数外,所有的数都能被前一个数整除(即是前一个数的倍数)。很快她找到了一个这样的序列。可是她觉得还不够,想要知道这样的序列有多少个,可她被惊人的数据范围吓怕了。现在她找到了你,请你来帮助她解决这个问题。(因为结果可能会很大,请输出对1e9+7取模后的值)

输入输出格式

输入格式:
第一行,两个正整数n,p。

输出格式:
仅一行,一个正整数,表示满足条件序列的个数对1e9+7取模后的值。

输入输出样例

输入样例#1:

3 2

输出样例#1:

5

输入样例#2:

6 4

输出样例#2:

39

说明

数据范围:

对于10%的数据,p=1;
对于30%的数据,1<=n,p<=10;
对于60%的数据,1<=n,p<=500;
对于100%的数据,1<=n,p<=2000。


题解

f[k][i]表示枚举到第k位,值为i的队列的个数

转移方程f[k][i*j]=f[k][i*j]+f[k-1][i]


代码

#include<cstdio>#define tt 1000000007using namespace std;int n,m,ans;int f[2005][2005];int main(){    scanf("%d%d",&n,&m);    f[0][1]=1;    for (int k=1;k<=m;k++)        for (int i=1;i<=n;i++)            for (int j=1;j<=n/i;j++)            {                f[k][i*j]=(f[k][i*j]+f[k-1][i])%tt;            }    for (int i=1;i<=n;i++) ans=(ans+f[m][i])%tt;    printf("%d",ans);    return 0;}
原创粉丝点击