[CF1061C Multiplicity]
Code
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int mod=1e9+7;
const int N=2e6;
int f[N],a[N],maxn=0,n;
long long ans=0;
vector<int> p[N];
void work(int x,int val){
rep(i,1,sqrt(val)){
if(val%i)continue;
p[x].push_back(i);
if(val/i!=i)p[x].push_back(val/i);
}
}
int main()
{
scanf("%d",&n);
rep(i,1,n)scanf("%d",&a[i]),work(i,a[i]);
f[0]=1;
rep(i,1,n)sort(p[i].begin(),p[i].end());
rep(i,1,n){
per(j,p[i].size()-1,0){
f[p[i][j]]=(f[p[i][j]]+f[p[i][j]-1])%mod;
}
}
rep(i,1,n)ans=(ans+f[i])%mod;
printf("%lld\n",ans);
return 0;
}
- 注意由于省掉了阶段这一维,所以为了防止在同层转移,枚举的时候倒序枚举