11点送命场没敢打,赛后补题,还是看了神仙代码才会的(弱~)。
dp,枚举每一个数,找出每一个数的因数,然后枚举相应的位置,状态方程为dp[j]+=dp[j-1](dp[k]记录的是已枚举完的数到k位置有多少组情况),空间优化一下所以要注意从大到小。
上代码~
#include<bits/stdc++.h>
using namespace std;
int dp[1000005];
const long long mod = 1e9+7;
int main(){
int a,i,n,j;
cin>>n;
dp[0]=1;
long long res=0;
for(i=1;i<=n;i++){
cin>>a;
vector<int>v,v2;
for(j=1;j*j<=a;j++){
if(a%j==0){
v.push_back(j);
if(a/j!=j){
v2.push_back(a/j);
}
}
}
reverse(v.begin(),v.end());
for(auto it:v2){
(dp[it]+=dp[it-1])%=mod;
(res+=dp[it-1])%=mod;
}
for(auto it:v){
(dp[it]+=dp[it-1])%=mod;
(res+=dp[it-1])%=mod;
}
}
cout<<res<<endl;
}