1539: 完美序列
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 31 Solved: 6
[Submit][Status][Web Board]
Description
已知一个长度为l的序列:b1,b2,b3,…,bl (1<=b1<=b2<=b3<=…<=bl<=n)。若这个序列满足每个元素是它后续元素的因子,换句话说就是对于任意的i (2<=i<=l)都满足bi%bi-1=0 (其中“%”代表求余),则称这个序列是完美的。你的任务是对于给定的n和l,计算出一共有多少序列是完美序列。由于答案很大,所有输出答案对1000000007取余后的结果。
Input
输入的第一行为一个正整数T (T<=1000),代表一共有T组测试数据。
每组测试数据包含两个正整数n,l (1<=n, l<=2000),分别代表序列中元素大小的最大值和序列的长度。
Output
对于每组测试数据,输出一行包含一个整数,代表答案对1000000007取余后的结果。
Sample Input
3
3 2
6 4
2 1
Sample Output
5
39
2
【分析】
dp预处理...f[i][j]表示长度为i,当前为j的方案总数,类似筛法求素数的方法往后推方案数就可以了
首先长度为1的方案数都是1,
然后对当前f[i][j]考虑f[i+1][k]=f[i+1][k]+f[i][j],k是j的倍数
对读取的最大值n和长度l,
答案就是f[l][i]的和(1<=i<=n)
【代码】
#include <stdio.h>
#define MOD 1000000007
int f[2010][2010]={0};
void init()
{
//长度i,当前j
for (int i=1;i<=2000;i++) f[1][i]=1;
for (int i=1;i<=2000;i++)
for (int j=1;j<=2000;j++)
for (int k=j;k<=2000;k+=j)
f[i+1][k]=(f[i+1][k]+f[i][j])%MOD;
}
int main()
{
init();
int pp;scanf("%d",&pp);
while (pp--)
{
int n,m;scanf("%d%d",&n,&m);
long long ans=0;
for (int i=1;i<=n;i++)
ans=(ans+f[m][i])%MOD;
printf("%lld\n",ans);
}
}