题解
题目大意 给一个序列a问能组成多少个子序列b 要求a序列元素顺序不能改变 a[i]只能出现在他的因子的下标位置
先打表将范围内数字因子求出 时限3秒足够 定义一个数组d 表示长度为i的情况有多少个
按照顺序遍历整个数组a倒序遍历他的因子k 如果他有因k他可以放在k这个位置 则d[k] = d[k] + d[k - 1]
最后给d整个数组求和求出每个位置结尾的情况
AC代码
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e6 + 10;
const int MOD = 1e9 + 7;
ll d[MAXN]; //长度为i的情况数量
vector<int> vec[MAXN]; //因子
int main()
{
#ifdef LOCAL
freopen("C:/input.txt", "r", stdin);
#endif
for (int i = 1; i < MAXN; i++)
for (int j = 1; i * j < MAXN; j++)
vec[i * j].push_back(i);
int N;
cin >> N;
d[0] = 1;
for (int i = 1; i <= N; i++)
{
int x;
scanf("%d", &x);
for (int j = vec[x].size() - 1; j >= 0; j--) //逆序防止自身造成贡献
{
int k = vec[x][j]; //因子
d[k] = (d[k] + d[k - 1]) % MOD; //可以放在当前位置则加上前一个位置的数量
}
}
ll ans = 0;
for (int i = 1; i <= N; i++) //以每个位置为结尾求和
ans = (ans + d[i]) % MOD;
cout << ans << endl;
return 0;
}