题意:给定一个数组{an},问这个数组的所有子序列{bm}中,有多少子序列满足:对于所有的i(1<=i<=m)满足bi是i的倍数,答案对10^9+7取模

题解:

首先想到二维DP,从i长中找到j长的子序列的方法=dp[i][j]

如果a[i]可以除以j,原式=dp[i-1][j-1]+dp[i-1][j]

否则,原式=dp[i-1][j];

j可以通过枚举a[i]的因数得到

然后我们发现可以把i这个维度压掉…

#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
const int maxn = 1e6 + 5;
int a[maxn];
vector<int> v[maxn];
int dp[maxn];
int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        v[i].clear();
        for (int j = 1; j * j <= a[i]; j++) {
            if (a[i] % j == 0) {
                v[i].push_back(j);
                if (j * j != a[i]) {
                    v[i].push_back(a[i] / j);
                }
            }
        }
        sort (v[i].begin(), v[i].end());
    }
    int ans = 0;
    dp[0] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = v[i].size() - 1; j >= 0; j--) {
            dp[v[i][j]] = (dp[v[i][j]] + dp[v[i][j] - 1]) % mod;
        }
    }
    for (int i = 1; i <= n; i++) {
        ans = (ans + dp[i]) % mod;
    }
    cout << ans<< endl;
    return 0;
}