/*
给你一个数组,让你删除一些数使得剩下的这些数第i个数能够整除i,问你有多少种方法。
题意:dp[i]表示长度为i的种树,正常做会超时,所以要先把每个数
分解因子,存入vector,dp便利的时候必须倒着来,因为dp[i]要用dp[i-1]
如果正着来,会用前面更新过的数据
*/
#include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[1000005];
int mod=1e9+7;
vector<int>v[100004];
signed main(){
int n;
cin>>n;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++){
int x;
scanf("%lld",&x);
v[i].clear();
for(int j=1;j<=sqrt(x);j++){
if(x%j==0){
v[i].push_back(j);//存因子
if(x!=j*j)v[i].push_back(x/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;
ans=(ans+dp[v[i][j]-1])%mod;
}
}
printf("%lld\n",ans);
return 0;
}
Multiplicity CodeForces - 1061C+DP数学
最新推荐文章于 2024-06-21 16:38:17 发布