题意:
从1-n中,找到k个数,使得后一个数能被前一个数整除,结果可能很大,对10e9+7取模
分析:
假设n为5
从k=1开始。
那么,能使用的数列有 {1},{2},{3},{4},{5}
k=2
能使用的数列{1,1},{1,2},{1,3},{1,4},{1,5}
{2,2},{2,4}
{3,3}
{4,4}
{5,5}
能够看出,之后的状态都是建立在之前的状态上的,k=2的左侧一列,就是k=1的状态。还不理解可以自己推一下k=3的情况。
从上一状态推算下一状态,我们可以想到使用动态规划。
int solve ( )
{
for(int i = 0; i <= N; ++ i)
dp[K][i] = 1;
for (int i = K-1; i > 0; i-- ){
for (int j = 1; j <= N; j++ ){
for (int k = j; k <= N; k+=j ){
dp[i][j] = (dp[i][j] + dp[i+1][k]) % MOD;
}
}
}
int res = 0;
for (int i = 1; i <= N; i++ )
res = (res + dp[1][i] ) % MOD;
return res;
}
int dfs (int depth, int curr ){ if (curr > N ) return 0; if (depth == K ) return 1; if (memo[depth][curr] != -1 ) return memo[depth][curr]; int res = 0; for (int i = 1; i*curr <= N; i++ ){ res = (res + dfs (depth + 1, i*curr ) ) %MOD; } // end for return memo[depth][curr] = res; }
深搜的思想是参考日本一位
童鞋的。