序列
题目大意:
定义“好序列”为满足每一个数是上一个数的倍数的序列,求一个长度为K的“好序列”
原题:
题目描述
一个长度为k的整数序列b1,b2,…,bk(1≤b1≤b2≤…≤bk≤N)称为“好序列”当且仅当后一个数是前一个数的倍数,即bi+1是bi的倍数对任意的i(1≤i≤k-1)成立。
给定N和k,请算出有多少个长度为k的“好序列”,答案对1000000007取模。
输入
输入共1行,包含2个用空格隔开的整数N和k。
输出
输出共1行,包含一个整数,表示长度为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。
解题思路:
设f[i][j]为第i位为j的情况有多少种,就得出以下状态转移方程:
f[i+1][c∗j]=f[i+1][c∗j]+f[i][j]f[i+1][c*j]=f[i+1][c*j]+f[i][j]f[i+1][c∗j]=f[i+1][c∗j]+f[i][j]
c表示下一位是当前位的几倍,然后直接照着打就可以了
代码:
#include<cstdio>
using namespace std;
int n,k,ans,f[2005][2005];
int main()
{scanf("%d %d",&n,&k);for (int i=1;i<=n;++i)f[1][i]=1;//预处理for (int i=1;i<k;++i)//第几位for (int j=n;j>0;--j)//是多少for (int c=1;c*j<=n;++c)//下一位是当前位的多少倍f[i+1][c*j]=(f[i+1][c*j]+f[i][j])%1000000007;//累加for (int i=1;i<=n;++i)ans=(ans+f[k][i])%1000000007;//计总值printf("%d",ans);
}