ZCMU—1539

来源:互联网 发布:win10摄像头录像软件 编辑:程序博客网 时间:2024/05/29 08:31

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 <stdio.h>#define MOD 1000000007int 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);}}


0 0
原创粉丝点击