给定一个序列 A,求有多少非空序列 B 满足 BA 的子序列   并且 ∀ k ∈ [1,lenb],  k∣bk k  [1,lenb],  kbk

 

// f[i][j]= f[i-1][j] + (f[i-1][j-1] ,a[i]%j==0 )

   优化: 枚举 a[i] 的因数作为 j

#include <iostream>
#include<vector> 
#include <algorithm>
#define IOS std::ios::sync_with_stdio(0)
using namespace std;
 const int N =1e5+3,M=1e6+3, mod=1e9+7;
 int n,a[N],f[M] ;
 vector<int> fac;
 
 
 // f[i][j]= f[i-1][j] + (f[i-1][j-1] ,a[i]%j==0 )
 void sov(){
 	int i,j;
 	f[0]=1;
 	for(i=1;i<=n;i++){
 		fac.clear();
 		for(j=1;j*j<=a[i];j++){
 			if(a[i]%j==0){
 				fac.push_back(j);
 				if(j*j!=a[i]) fac.push_back(a[i]/j);
 			}
 		}
 		sort(fac.begin(),fac.end());
 		
 		for(j=fac.size()-1;j>=0;j--)
 			f[fac[j]]=f[fac[j]]+f[fac[j]-1],f[fac[j]]%=mod;
 	}
 	
 	int ans=0;
 	for(i=1;i<=n;i++) ans+=f[i],ans%=mod;
 	cout<<ans<<endl;
 }
 
 signed main(){
 	cin>>n;
 	for(int i=1;i<=n;i++)
 	 cin>>a[i];
 	sov();
 }
 
 
 

 

 

 

 

posted on 2023-02-22 18:52  towboat  阅读(16)  评论(0)    收藏  举报