分享一下第四题的方法没参加这场赛后听的描述写的 不保证正确但是复杂度应该是n^2loglog的先对数组排序然后dpdp[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 longconst 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;}
点赞 3
评论 0
全部评论

相关推荐

昨天 13:50
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务