序列
题目描述
一个长度为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。
思路:主要在于上一长度的序列结尾数,可以利用因子计算。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//程序名:新的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; }