洛谷 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 1000000007
using 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;
}