2. 序列
(sequence.cpp/c/pas)
【问题描述】
一个长度为k的整数序列b1,b2,…,bk(1≤b1≤b2≤…≤bk≤N)称为“好序列”当且仅当后一个数是前一个数的倍数,即bi+1是bi的倍数对任意的i(1≤i≤k-1)成立。
给定N和k,请算出有多少个长度为k的“好序列”,答案对1000000007取模。
【输入】
输入文件名为sequence.in。
输入共1行,包含2个用空格隔开的整数N和k。
【输出】
输出文件名为sequence.out。
输出共1行,包含一个整数,表示长度为k的“好序列”的个数对1000000007取模后的结果。
【输入输出样例】
sequence.in | sequence.out |
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。
分析:
dp,状态转移方程:f[i,j]:=(f[i,j]+f[i*k,j-1]) mod 1000000007;
代码;
const
maxn=2000;
var
f:array[1..maxn,1..maxn] of longint;
n,m,ans:longint;
procedure init;
var
i:longint;
begin
readln(n,m);
for i:=1 to n do
f[i,1]:=1;
end;
procedure main;
var
i,j:longint;
begin
for j:=2 to m do
for i:=1 to n do
for k:=1 to n div i do
begin
if f[i*k,j-1]=0 then
break;
f[i,j]:=(f[i,j]+f[i*k,j-1]) mod 1000000007;
end;
for i:=1 to n do
ans:=(ans+f[i,m]) mod 1000000007;
writeln(ans);
end;
begin
assign(input,'sequence.in');reset(input);
assign(output,'sequence.out');rewrite(output);
init;
main;
close(input);close(output);
end.