序列

    xiaoxiao2021-03-25  100

    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,k: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.

    转载请注明原文地址: https://ju.6miu.com/read-19460.html

    最新回复(0)