题意:长度为l的合法序列为 bi|bi+1 &&bi<=n 给出n,k(n,k<=2e3)求长度为k的合法序列个数?
一开始想用逆事件,至少有一个不合法的个数来算 结果有些序列被重复计算,于是还是正面求解吧....
dp[k][x] 长度为k的序列 开头为x时的合法个数
dp[k][x]=sigma(dp[k-1][y]) y>=x &&x|y y为x倍数所以时间复杂度为 O(knlogn)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=2e3+20;
ll f[N];//f[i] n^i
ll dp[N][N];
int main()
{
int n,k;
while(cin>>n>>k)
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
dp[1][i]=1;
for(int i=2;i<=k;i++)
{
//O(knlogn)
for(int x=1;x<=n;x++)
{
for(int y=x;y<=n;y+=x)
{
dp[i][x]=(dp[i][x]+dp[i-1][y])%mod;
}
}
}
ll ans=0;
for(int x=1;x<=n;x++)
ans=(ans+dp[k][x])%mod;
cout<<ans<<endl;
}
return 0;
}