Educational Codeforces Round 9 D

  这个题的意思是给你一串数字序列, 和一个数m, 然后你选一个最长的序列使得这个序列的lcm小于等于m, 由于m<=10^6, 因此我们可以定义dp[i]为序列中倍数为i的元素个数, 然后倒着推一遍即可, 代码如下:

#include <bits/stdc++.h>

using namespace std;
int n, m;
int a[1000000 + 100];
int dp[1000000 + 100];

int main() {
    scanf("%d%d", &n, &m);
    for(int i=0; i<n; i++){
        scanf("%d", &a[i]);
        if(a[i]<=m) dp[a[i]]++;
    }
    for(int i=m; i>=1; i--) {
        if(dp[i])
            for(int j=2*i; j<=m; j+=i) dp[j]+=dp[i];
    }

    int lcm=1, maxnum=0;    //答案中的元素个数为0的时候lcm=1
    for(int i=1; i<=m; i++) {
        if(dp[i] > maxnum)
            maxnum = dp[i], lcm = i;
    }
    printf("%d %d\n", lcm, maxnum);
    int tpnum = 0;
    for(int i=0; i<n; i++) {
        if(lcm%a[i] == 0) {
            printf("%d", i+1);
            tpnum ++;
            if(tpnum == maxnum) printf("\n");
            else printf(" ");
        }
    }
    return 0;
}

 

posted @ 2016-03-22 16:06  xing-xing  阅读(117)  评论(0编辑  收藏  举报