zoukankan      html  css  js  c++  java
  • 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
    ", 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("
    ");
                else printf(" ");
            }
        }
        return 0;
    }
  • 相关阅读:
    Redis主从复制
    Redis发布订阅
    Redis持久化
    初探redis.config
    java连接Linux服务器问题
    Redis常见类型及API
    Redis安装
    Nosql
    JMM
    SpringSecurity
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5306954.html
Copyright © 2011-2022 走看看