タイトルリンク:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id = 1539
トピック
完全なシーケンスはlの長さとして定義され、最大値はnを超えず、昇順であり、前のシーケンスが次のシーケンスの因数になります。
nとlを与え、1e9 +7を法としていくつの完全なシーケンスが必要かを尋ねます。
アイデア
dp前処理、dp [i] [j]は、長さがiであることを意味し、最後の桁は、j、kがjから始まり、j * 2、j * 3のように、上限n、ここではkまでの完全なシーケンスの数です。は、最後にjが付いた完全なシーケンスの次のビットとして使用できるため、dp [i] [k]はdp [i-1] [j](1 <= j <= n)の累積です。
最後に、lの最大長がnを超えない完全なシーケンスが必要であり、それはdp [l] [i](1 <= i <= n)の累積です。
ACコード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1e9 + 7;
int dp[2021][2021];
int main(){
int t; scanf("%d", &t);
for(int i = 1; i <= 2020; i ++) dp[1][i] = 1;
for(int i = 2; i <= 2020; i ++){
for(int j = 1; j <= 2020; j ++){
for(int k = j; k <= 2020; k += j){
dp[i][k] = (dp[i][k] + dp[i - 1][j]) % mod;
}
}
}
while(t --){
int n, l;
scanf("%d%d", &n, &l);
int ans = 0;
for(int i = 1; i <= n; i ++) ans += dp[l][i], ans %= mod;
printf("%d\n", ans);
}
return 0;
}