美团笔试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;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
12-17 16:54
点赞 评论 收藏
分享
评论
3
5
分享
牛客网
牛客企业服务