美团笔试9.2
分享一下第四题的方法
没参加这场赛后听的描述写的 不保证正确但是复杂度应该是n^2loglog的
先对数组排序然后dp
dp[i][j]表示第i个数字长度为j的符合题意的串有多少个
那么dp[i][j] = dp[k][j-1]对每个满足a[k]%a[i]==0的k求和
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXN = 1e3 + 10;
const int MOD = 1e9+7;
int a[MAXN];
ll dp[MAXN][MAXN];
map<int, ll> mp;
int main() {
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
int len = n-k;
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
dp[i][1] = 1;
mp[i] = 1;
}
for(int j=2;j<=len;j++){
for(int i=n;i>=1;i--){
for(int k = 2*a[i];k <= a[n];k+=a[i]){
if(mp.find(k)!=mp.end()){
dp[i][j] = (dp[i][j] + mp[k])%MOD;
}
}
}
mp.clear();
for(int i=1;i<=n;i++){
mp[i] = dp[i][j];
}
}
ll ans = 0;
for(int i=1;i<=n;i++){
ans = (ans + dp[i][len])%MOD;
}
printf("%lld\n",ans);
return 0;
}