【DP】序列
序列
題目大意:
定義“好序列”為滿足每一個數是上一個數的倍數的序列,求一個長度為K的“好序列”
原題:
題目描述
一個長度為k的整數序列b1,b2,…,bk(1≤b1≤b2≤…≤bk≤N)稱為“好序列”當且僅當后一個數是前一個數的倍數,即bi+1是bi的倍數對任意的i(1≤i≤k-1)成立。
給定N和k,請算出有多少個長度為k的“好序列”,答案對1000000007取模。
輸入
輸入共1行,包含2個用空格隔開的整數N和k。
輸出
輸出共1行,包含一個整數,表示長度為k的“好序列”的個數對1000000007取模后的結果。
輸入樣例
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。
解題思路:
設f[i][j]為第i位為j的情況有多少種,就得出以下狀態(tài)轉移方程:
f[i+1][c?j]=f[i+1][c?j]+f[i][j]f[i+1][c*j]=f[i+1][c*j]+f[i][j]f[i+1][c?j]=f[i+1][c?j]+f[i][j]
c表示下一位是當前位的幾倍,然后直接照著打就可以了
代碼:
#include<cstdio> using namespace std; int n,k,ans,f[2005][2005]; int main() {scanf("%d %d",&n,&k);for (int i=1;i<=n;++i)f[1][i]=1;//預處理for (int i=1;i<k;++i)//第幾位for (int j=n;j>0;--j)//是多少for (int c=1;c*j<=n;++c)//下一位是當前位的多少倍f[i+1][c*j]=(f[i+1][c*j]+f[i][j])%1000000007;//累加for (int i=1;i<=n;++i)ans=(ans+f[k][i])%1000000007;//計總值printf("%d",ans); }總結
- 上一篇: 高通推出S7和S7 Pro音频平台
- 下一篇: 【DP】游戏