首页 > 其他分享 >CF Div. 2 C

CF Div. 2 C

时间:2024-05-29 12:01:18浏览次数:23  
标签:lcm le return int CF LCM Div include

Codeforces Round 948 (Div. 2) C. Nikita and LCM

标签

暴力枚举

数据结构

[[数学]]

题目大意

有长度为n的数组a,求a中最长子序列的长度,子序列要满足 \(lcm(subArray(a)) \notin a\)

\(1 \le n \le 2000\) , \(1 \le a_i \le 10^9\) ,对于t个测试案例,\(sum(n) \le 2000\)

思路

1.分解问题

首先解决一个问题,假定有了数组a和一个数字k,要求\(lcm(subArray(a)) = k\) ,要如何实现

  • 所有 \(a_i\) 判断是否是 \(k\) 的约数,然后将符合的所有 \(a_i\) 的lcm求出,如果是 \(k\) 说明成立

其次可以得到,假如枚举 \(k\) 值,再记录可行的 \(k\) 对应的 \(subArray(a)\) 的长度即可求解

2.优化方案

由于第一个子问题为 \(O(2n)\) 复杂度,从1枚举到1e9,是不可能的,那么我们可以用整个 \(a\) 的 \(LCM\)

所有 \(lcm(subArray(a))\) 一定为 \(LCM\) 的约数,记作 \(k\) ,如果对于 \(k\) 满足条件,并且 \(k \notin a\) ,可以确定此时可行,记录结果。

3.代码

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<unordered_map> 

using namespace std;
#define int unsigned long long
#define endl "\n"
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define rep(i,j,k) for(i=(j);i<(k);i++)
#define all(x) begin(x),end(x)

const int N = 2000 + 10;
int ii, jj, kk;

int gcd(int a, int b) { return  (b == 0 ? a : gcd(b, a % b)); }

int lcm(int a, int b) { return ((b / gcd(a, b)) * a); }

int _, n;

// 子问题1
int check(vector<int>& v, int k) {
    vector<int>vv;
    for (auto i : v) {
        if (k % i == 0)
            vv.emplace_back(i);
    }
    int LCM = 1;
    for (auto i : vv) {
        LCM = lcm(LCM, i);
        if (LCM > k)return 0;
    }
    if (LCM == k)
        return vv.size();
    return 0;
}
void solve() {
    cin >> n;
    vector<int>v(n);
    unordered_map<int, int>mp; // 存储输入元素 优化方案中用于判断k是否属于a
    int LCM = 1; // a的总LCM
    for (auto& i : v) {
        cin >> i;
        mp[i]++;
    }
    int mx = *max_element(all(v)); // 最大元素
    for (auto& i : v) {
        LCM = lcm(LCM, i);
        if (LCM > mx) {  // 如果LCM大于mx,直接return
            cout << n << endl;
            return;
        }
    }

    int cnt = 0;
    for (int i = 1; i * i <= mx; i++) {
        if (mx % i == 0) {
            if (mp.count(i) == 0)   // 如果i是LCM约数且不是a中元素,判断
                cnt = max(cnt, check(v, i));
            if (mp.count(LCM / i) == 0)
                cnt = max(cnt, check(v, LCM / i));
        }
    }
    cout << cnt << endl;
    return;
}
signed main() {
    IOS;
    cin >> _;
    while (_--)
        solve();
    return 0;
}

标签:lcm,le,return,int,CF,LCM,Div,include
From: https://www.cnblogs.com/lulaalu/p/18219971

相关文章

  • CF1843E Tracking Segments
    题目链接:https://www.luogu.com.cn/problem/CF1843E思路:题目要求至少第几次修改后满足给定的一个区间是美丽区间.我们发现修改操作是有单调性的,随着修改次数的增加,那么满足的美丽区间数量一定会保持不变或增多.因此我们选择二分答案,二分修改次数.二分答案的check函数就根......
  • 大学生看过来:CCF-智谱清言-全国智能体开发比赛
    前言Al界的新话题——基于大模型(LLM)的智能体正在成为大学生日常工具,它们正式让人人都是产品经理变得有可能。它们模仿人类决策过程,拥有无限的应用潜力和强大功能。想要提升学习效率、丰富自己的课余生活、实现人机协同?智能体让你轻松搞定!只要能看到需求有痛点,就可以创作智......
  • CCF-CSP真题《202403-1 词频统计》思路+python满分题解
    哇q(≧▽≦q),第一次写博客,请大家多多关照○| ̄|_ 看到没啥人提供202403的第一题解题思路及python代码,刚好写完,心血来潮想分享解题思路,就写下了这篇博客,有其他的编码版本,欢迎大家一起探讨呀(虽然我是算法菜鸟┗(T﹏T)┛,但有问题,我会尽力回答的!!!)好了废话不多说,上解题思路!大概想了......
  • 「杂题乱刷」CF1977B
    题目链接CF1977B(luogu)CF1977B(codeforces)解题思路考虑通用做法。我们发现如果直接用二进制来表示的话这个数会只包含\(0,1\)这两个数字。发现这时阻碍我们构造的是连续的数字\(1\)。考虑消除连续的数字\(1\)。容易发现连续的数字\(1\)可以转化成将这一段最高位......
  • 「杂题乱刷」CF1977C
    题目链接CF1977C(luogu)CF1977C(codeforces)解题思路首先这题有一个简单的思路,就是当这个序列的LCM大于\(10^9\)时,显然取所有数字数字是合法的。然后我们接下来考虑LCM小于等于\(10^9\)的情况。发现这种情况LCM很小,且有一个简单的结论,就是你在序列中任选一个子......
  • codeforces round 948(Div2)
    A题目过简单,略B.构造+二进制点击查看代码#include<bits/stdc++.h>#defineLLlonglongLLx,ans[40];boolyes[40];intmain(){std::ios::sync_with_stdio(0),std::cin.tie(0);intT;std::cin>>T;while(T--){std::cin>>x;for(LLi......
  • 从CF1660F2看同余分组
    https://codeforces.com/contest/1660/problem/F2同余分组,树状数组维护逆序对先承继F1的做法,维护一个前缀和数组,让s[i]=='+'为\(1\),s[i]=='-'为\(-1\)。那么要满足两个条件:\(pre_r-pre_l\leq0\)要么加减号相同,要么减号更多(只有减号能减少)\(pre_r-pre_l......
  • 【最新区块链论文录用资讯】CCF A—INFOCOM 2024 共17篇
    Conference:IEEEInternationalConferenceonComputerCommunicationsCCFlevel:CCFACategories:计算机网络Year:2024Num:17AGenericBlockchain-basedSteganographyFrameworkwithHighCapacityviaReversibleGAN通过可逆GAN实现高容量的基于区块链的通用隐......
  • Codeforces Round 948 (Div. 2)
    A.LittleNikita题意:\(n\)步操作,\(+1\)或\(-1\),最终结果是否等于\(m\)思路:设\(+1\)的操作次数为\(x\),\(-1\)的操作次数为\(y\)\[x+y=n\\x-y=m\]\[x=(n+m)/2\\y=(n-m)/2\]\((n-m)\)和\((n+m)\)均为偶数,即\(n\)和\(m\)均为偶数或同为奇数,且\(n>=m\)代码:voidsolve()......
  • cfa三级大神复习经验分享系列(一)
    教材还是Notes?对于愚钝如我之流,建议大家三级一定要看教材。Note很精华很浓缩,我觉得看过教材再看note感觉总结的很精辟,但是Note是以考点列的,而教材像小说一样娓娓道来,有逻辑有情节,如果不follow很难理解,或者说很难吃透里面的很多概念。我这次基本没碰notes,感觉没有大问题。......