首页 > 其他分享 >求区间[l, r]中各个数的因数

求区间[l, r]中各个数的因数

时间:2024-11-20 22:45:34浏览次数:1  
标签:std 各个 int 因数 vector str 区间 契合

求区间[l, r]中各个数的因数

今日通过一道题学会了一个使用调和级数(时间复杂度Ologn)求区间中各个数的因数,感觉还是数论的内容,记录一下。

题目概述:

给定l, r。求l-r中各个数的因数

代码:

void get_results(int l, int r) {
    std::vector<std::vector<int>> f(r + 1);
    for (int i = 1; i <= r; i ++) {
        for (int j = i; j <= r; j += i) {
            // 对于每个i,我们都从i开始往后以i为距离++,所以每个j都是当前i的倍数,i就是当前j的因子
            f[j].push_back(i);
        }
    }
    for (int i = l; i <= r; i ++) {
        std::cout << i << ":";
        for (int e : f[i]) {
            std::cout << e << " ";
        }
        std::cout << "\n";
    }
}

给出一道变形的题,加上状态压缩:

https://oj.cwnu.online-judge.cn/p/YS0005

题目概要:

给出n对数据,每一对数据为(string str, int x)的形式;并且给出一个字符串T。判断每一对字符串与x对应的目标串是否契合?契合yes;不契合no。

契合:x对应的目标串是指:x的所有因数对应的下标映射在字符串T的字符的集合STR。如果str中的所有字符都在STR中存在,那么就是契合

void solve() {
    int n;
    std::cin >> n;
    std::vector<std::pair<int, int>> a(n);
    for (int i = 0; i < n; i ++) {
        std::string str;
        std::cin >> str >> a[i].second; // 输入字符串和x
        for (auto e : str) {
            int t = e - 'a';
            a[i].first |= 1 << t;// 状态压缩,将字符串映射为int整数,每次将所有字符用位运算或,二进制中每一位对应一个小写字母,最后得到的二进制中位为1的就代表那一位对应的字母在str中存在
        }
    }
    std::string s;
    std::cin >> s;
    int len = s.size();
    std::vector<int> f(n+1);
    for (int i = 1; i <= len; i ++) {
        for (int j = i; j <= len; j += i) {
            // 调和级数,对于每一个i,往后遍历的每一个j都是i的倍数,所以i是j的一个因子。每次将i放入集合中,这道题是用与运算放入f集合的
            int t = s[i-1] - 'a';
            // i为j的因子,s[i-1]为映射到T中的字符,同样用状态压缩,将集合映射为int整数
            f[j] |= 1 << t;  // f[j]表示x对应字串的集合(去重)对应的二进制整数
        }
    }
    for (auto [x, y] : a) {
        // 位运算技巧,判断两个集合对应的状态压缩二进制的关系:
        // x 每一位属于 y :x | y == y
        std::cout << ((x | f[y]) == f[y] ? "YES" : "NO") << "\n"; 
    }
}

标签:std,各个,int,因数,vector,str,区间,契合
From: https://www.cnblogs.com/zj-cnbolgs/p/18559550

相关文章

  • spring cloud内容汇总(各个功能模块,启动,部署)
    SpringCloud是一套基于SpringBoot的框架集合,用于构建分布式微服务架构。它提供了一系列工具和库,帮助开发者更轻松地管理分布式系统中的关键问题,比如服务注册与发现、负载均衡、分布式配置管理、熔断与降级、链路追踪等。下图展示了微服务架构中每个主要功能模块的常用解决方......
  • 合并区间
    合并区间题目以数组intervals表示若干个区间的集合,其中单个区间为intervals[i]=[starti,endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。示例示例1:输入:intervals=[[1,3],[2,6],[8,10],[15,18]]输出:[[1,6],[8,10]......
  • 从 AI 大模型的定义、应用场景、优势以及挑战等方面,探讨 AI 是如何重塑软件开发的各个
    随着人工智能技术的迅猛发展,特别是大规模预训练模型(大模型)的兴起,软件开发行业正经历着前所未有的变革。大模型是指那些参数量巨大、能够处理复杂任务的人工智能模型,如GPT-3、BERT等。这些模型不仅在自然语言处理领域取得了突破性进展,还在计算机视觉、语音识别等多个领域展现出......
  • 2024-11-16:哈沙德数。用go语言,如果一个整数能够被它的各个数位上数字的和整除, 我们称
    2024-11-16:哈沙德数。用go语言,如果一个整数能够被它的各个数位上数字的和整除,我们称这个整数为哈沙德数(Harshadnumber)。给定一个整数x,如果x是哈沙德数,则返回x各个数位的数字和;如果不是,则返回-1。输入:x=18。输出:9。解释:x各个数位上的数字之和为9。18能被9......
  • 代码随想录算法训练营第三十天| 452. 用最少数量的箭引爆气球 、435. 无重叠区间 、76
    452.用最少数量的箭引爆气球思路:以前做过最大不相交子序列的题,这次也是往这根据某一端排序的思路想的,排序后如下图,只需要维护一个公共序列的右边界r就可以了,下一次判断时,只需要判断子区间的左边是否小于r。这个题有点坑的是使用Arrays排序,如果使用昨天的方法:Arra......
  • 【题解】洛谷P1712: [NOI2016] 区间
    P1712[NOI2016]区间我对尺取法并不敏感,所以感觉有点难度,我们想到按照区间长度排序加入使得满足单调性,直到有一个区间的覆盖次数达到了m就可以计算了,而这个就是尺取法,单调性使得我们答案总是最优的。覆盖次数就可以用线段树做,而且数据范围很大需要离散化,计算答案时注意把答案带......
  • 【华为OD机试真题E卷】573、区间交叠问题 | 机试真题+思路参考+代码解析(E卷复用)(C++、J
    文章目录一、题目......
  • STL容器的各个函数方法
    std::vectorstd::vector是一个动态数组,支持随机访问。push_back(value):在末尾添加一个元素。pop_back():移除末尾的元素。size():返回容器中的元素数量。empty():检查容器是否为空。at(index):访问指定位置的元素,带边界检查。front():返回第一个元素。back():返回最后一个元......
  • 区间整除
    Q6.1.3.3区间整除题意:区间加,区间整除,区间和,区间最小值.Sol1区间整除时若当前区间\(\max=\min\),改成区间覆盖,否则继续复杂度玄学Sol2有一波性质分析:发现\(\left\lfloor\dfracxk\right\rfloor-\left\lfloor\dfrac{x-1}k\right\rfloor\le1\)稍微推广一下:\(x-1-\left\lf......
  • P8868 [NOIP2022] 比赛(线段树维护区间历史和)
    题意给定排列\(a,b\),\(q\)次询问\(l,r\),你需要求出\(\sum_{l\lel'\ler'\ler}(\max_{i=l'}^{r'}a_i)(\max_{i=l'}^{r'}b_i)\)对\(2^{64}\)取模的值。\(n,q\le2.5\times10^5\)分析根据经典套路,按\(r\)扫描线,维护两个单调栈,那么加入一个数就相当于进行若干段区......