ZCMU—1539

1539: 完美序列

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 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 
#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);
	}
}


你可能感兴趣的:(zcmu)