$dp$。
记$dp[i][j]$表示已经放了$i$个数字,并且第$i$个数字放了$j$的方案数。那么$dp[i][j] = \sum\limits_{k|j}^{} {dp[i - 1][k]}$
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-6; void File() { freopen("D:\\in.txt","r",stdin); freopen("D:\\out.txt","w",stdout); } template <class T> inline void read(T &x) { char c = getchar(); x = 0; while(!isdigit(c)) c = getchar(); while(isdigit(c)) { x = x * 10 + c - ‘0‘; c = getchar(); } } const int maxn=2020; LL dp[maxn][maxn],mod=1e9+7; int n,m; int main() { scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) dp[1][i]=1; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { for(int k=j;k<=m;k=k+j) { dp[i+1][k]=(dp[i+1][k]+dp[i][j])%mod; } } } LL ans=0; for(int i=1;i<=m;i++) ans=(ans+dp[n][i])%mod; cout<<ans<<endl; return 0; }
时间: 2024-10-21 20:20:09