题目:Multiplicity
思路:
先把每一个数的质因数处理出来。
令f[i]表示长度为i的子序列的方案数。
转移方程:
f
i
=
∑
f
i
−
1
f_i=\sum f_{i-1}
fi=∑fi−1
代码:
#include<bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
#define maxn 100000
#define maxm 1000000
#define md ((int)1e9+7)
int n;
int a[maxn+5];
int f[maxm+5];
vector<int> b[maxn+5];
int main() {
read(n);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=n;i++) {
for(int j=1;j<=sqrt(a[i]);j++) {
if(a[i]%j==0) {
b[i].push_back(j);
if(j*j!=a[i]) b[i].push_back(a[i]/j);
}
}
}
int ans=0;
f[0]=1;
for(int i=1;i<=n;i++) {
for(int j=b[i].size()-1;j>=0;j--) {
int y=b[i][j];
f[y]=(f[y]+f[y-1])%md;
ans=(ans+f[y-1])%md;
}
}
printf("%d",ans);
return 0;
}