Codeforces Round 828 (Div. 3)E题题解

news2024/12/28 20:54:36

文章目录

  • [Divisible Numbers (easy version)](https://codeforces.com/contest/1744/problem/E1)
    • 问题建模
    • 问题分析
      • 代码
  • [ Divisible Numbers (hard version)](https://codeforces.com/contest/1744/problem/E2)
    • 问题建模
    • 问题分析
      • 1.根据简单版本分析所求
      • 2.方法1通过因数分解得到a和b的因数,再获得a * b的因数
        • 代码
      • 3.方法2分解a和b的质因数,通过质因数组成a*b的两个因数
        • 代码

Divisible Numbers (easy version)

在这里插入图片描述在这里插入图片描述

问题建模

给定4个数,a,b,c,d,问是否存在两个数x,y, a < x < = c , b < y < = d a<x<=c,b<y<=d a<x<=c,b<y<=d,满足x * y被a * b整除。

问题分析

由于x * y需要包含a * b所有的因数,且x,y还要在一定的范围内,则可以先保证一个数x1在合法位置内,然后通过 a ∗ b / g c d ( a ∗ b , x 1 ) a*b/gcd(a*b,x1) ab/gcd(ab,x1)获得一个包含a * b剩余因子的数s,然后再将其扩大为比d小的数,在检查是否比b大即可。

代码

#include<bits/stdc++.h>

#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N =2e5+10, Mod = 998244353, P = 2048;

void solve() {
    LL a,b,c,d;
    cin >>a >>b >>c >>d;
    for(LL i=a+1;i<=c;i++){
        LL s=a*b/(__gcd(a*b,i));
        LL x=d/s*s;
        if(x>b){
            cout <<i <<" " <<x <<"\n";
            return ;
        }
    }

    cout <<-1 <<" " <<-1 <<"\n";
}   


int main() {
    int t = 1;
    cin >> t;
    while (t--) solve();
    return 0;
}

Divisible Numbers (hard version)

在这里插入图片描述在这里插入图片描述

问题建模

给定4个数,a,b,c,d,问是否存在两个数x,y, a < x < = c , b < y < = d a<x<=c,b<y<=d a<x<=c,b<y<=d,满足x * y被a * b整除。

问题分析

1.根据简单版本分析所求

由于整数的范围扩大,若枚举a+1到c会超时。简单版本中通过 a ∗ b / g c d ( a ∗ b , x 1 ) a*b/gcd(a*b,x1) ab/gcd(ab,x1)获得一个包含a * b剩余因子的数s,实际上是通过枚举x1得到a * b的一个因子,然后获得另一个因子,然后再放大另外一个因子得到符合范围的数。则实际上我们是要获得a * b的因数。

2.方法1通过因数分解得到a和b的因数,再获得a * b的因数

由于a*b的因数是由a的因数乘b的因数得到的,则可以先得到a,b的因数,然后枚举两个因数的乘积从而得到a * b的因数。然后再像简单版本中的做法类似,将两个因数放大到合法范围。由于1e18内的数,最多有103680个因数,1e9内的数最多有1344个因数。则时间复杂度为O( a + b + ( 1344 ) 2 \sqrt{a}+\sqrt{b}+(1344)^2 a +b +(1344)2)

代码

#include<bits/stdc++.h>

#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N = 2e5 + 10, Mod = 998244353, P = 2048;

void solve() {
    LL a, b, c, d;
    cin >> a >> b >> c >> d;
    vector<LL> v1, v2;
    ///获得a,b的因数
    for (int i = 1; i <= a / i; i++) {
        if (a % i == 0) {
            v1.push_back(i),v1.push_back(a / i);
        }
    }
    for (int i = 1; i <= b / i; i++) {
        if (b % i == 0) {
            v2.push_back(i),v2.push_back(b / i);
        }
    }

    for (auto i : v1) {
        for (auto j : v2) {
            ///获得a*b的两个因数,然后将其放大到合法的范围
            LL x = i * j,y=a*b/x;
            x*=c/x;
            y*=d/y;
            if(x>a&&y>b){
                cout <<x <<" " <<y <<"\n";
                return ;
            }
        }
    }

    cout << -1 << " " << -1 << "\n";
}


int main() {
    int t = 1;
    cin >> t;
    while (t--) solve();
    return 0;
}

3.方法2分解a和b的质因数,通过质因数组成a*b的两个因数

由于a*b的因数是由a的部分质数乘b的部分质数得到的,则可以先得到a,b的各个质数,然后通过DFS分配各个质数的数量,从而得到a * b的两个因数。然后再像简单版本中的做法类似,将两个因数放大到合法范围。1e18的数质数组合能产生的因数数量大概为1e5,故不会超时。

代码

#include<bits/stdc++.h>

#define x first
#define y second
#define C(i) str[0][i]!=str[1][i]
using namespace std;
typedef unsigned long long ULL;
typedef long long LL;
typedef pair<int, int> PII;
typedef pair<LL, LL> PLL;
const int N = 2e5 + 10, Mod = 998244353, P = 2048;
LL a,b,c,d;
map<int,int> mp;
vector<PII> primes;

void divide(int n){
    for(int i=2;i<=n/i;i++){
        while(n%i==0)   mp[i]++,n/=i;
    }
    if(n>1) mp[n]++;
}

bool dfs(int u,LL x,LL y){
    if(u==primes.size()){
        x*=c/x;
        y*=d/y;
        if(x>a&&y>b){
            cout <<x <<" " <<y <<"\n";
            return true;
        }else return false;
    }
///分配当前质数的数量到两个因数当中
    int p=primes[u].x,cnt=primes[u].y;
    for(int i=1;i<=cnt;i++) y*=p;
    for(int i=0;i<=cnt;i++){
        if(dfs(u+1,x,y))    return true;
        x*=p,y/=p;
    }
    return false;
}

void solve() {
    mp.clear(),primes.clear();
    cin >>a >>b >>c >>d;
    ///先得到a,b的各个质数数量
    divide(a),divide(b);
    for(auto v:mp)  primes.push_back(v);
    if(!dfs(0,1,1)) cout <<-1 <<" " <<-1 <<'\n';
}


int main() {
    int t = 1;
    cin >> t;
    while (t--) solve();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/861323.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

竞赛项目 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

MongoDB安装和配置

一、MongoDB安装和配置 1、进入官网下载你所需要的安装版本&#xff0c;点击直通官网 Step1&#xff1a;进入官网后&#xff0c;将看到如下界面&#xff0c;点击上方导航栏Products&#xff0c;找到Community Server Step2&#xff1a;选择自己需要的版本、系统和压缩方式 2、下…

Java算法_ 岛屿数量(LeetCode_Hot100)

题目描述&#xff1a;给你一个由 &#xff08;陆地&#xff09;和 &#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。‘1’ , ‘0’ 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#…

Java:Stream API

文章目录 1 说明2 为什么要使用Stream API3 什么是StreamStream的操作三个步骤创建Stream实例一系列中间操作终止操作 1 说明 Java8中有两大最为重要的改变。第一个是 Lambda 表达式&#xff1b;另外一个则是 Stream API。Stream API ( java.util.stream) 把真正的函数式编程风…

Linux6.37 Kubernetes 集群调度

文章目录 计算机系统5G云计算第三章 LINUX Kubernetes 集群调度一、调度约束1.调度过程2.指定调度节点3.亲和性1&#xff09;节点亲和性2&#xff09;Pod 亲和性3&#xff09;键值运算关系 4.污点(Taint) 和 容忍(Tolerations)1&#xff09;污点(Taint)2&#xff09;容忍(Toler…

聊聊行锁、间隙锁、临键锁的区别

一、准备 创建 student 表 CREATE TABLE student ( id bigint NOT NULL, age int DEFAULT NULL, b int DEFAULT NULL, a int DEFAULT NULL, c int DEFAULT NULL, PRIMARY KEY ( id ), ) ENGINEInnoDB DEFAULT CHARSETutf8mb3 插⼊数据 insert into student (id,age,a,b,c) val…

Java【Spring】使用注解, 更简单的存储和获取 Bean

文章目录 前言一、存储 Bean1, 配置文件2, 五大类注解Bean 的命名规则 3, 方法注解Bean 的命名规则 二、获取 Bean1, 属性注入2, Setter 注入3, 构造方法注入4, Autowired 和 Resource 的区别5, 同一个类型的多个 Bean 注入问题 总结 前言 各位读者好, 我是小陈, 这是我的个人主…

机器学习、深度学习项目开发业务数据场景梳理汇总记录三

本文的主要作用是对历史项目开发过程中接触到的业务数据进行整体的汇总梳理&#xff0c;文章会随着项目的开发推进不断更新。 这里是续文&#xff0c;因为CSDN单篇文章内容太大的话就会崩溃的&#xff0c;别问我怎么知道的&#xff0c;问就是血泪教训&#xff0c;辛辛苦苦写了一…

C语言 指针与const

const 修饰变量&#xff0c;使得这个变量不能被修改。 const 对指针具有两种修饰的方式&#xff0c;且两种方式所限制的情况不同。 当const在 * 的左边 const int * p &n; 或者 int const * p &n; 当const在*的左边时&#xff0c;指针变量p所指向的空间内容无法被修…

C语言 指针与assert

assert 又称断言&#xff0c;需要包含头文件 assert.h 用于在运行时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终止运行。 assert(p ! NULL); 上面代码在程序运行到这一行语句时&#xff0c;验证变量 p 是否等于 NULL。如果确实不等于 NULL &#xff0c;…

慎写指针类型的全局变量

简述: 在 关于range二三事[1] 第二个case中,介绍了对于指针类型的 切片/map变量A 的循环,要格外注意, 迭代出的value作用域是整个方法而非循环体内. 改进办法:在循环体中引入中间变量,"暂存"下每次迭代的value的值 但对于这个A,如果是全局变量,则又极有可能出现问题:…

Apache Maven简介安装及系统坏境配置eclipse配置Apache Maven---详细介绍

一&#xff0c;简介 Maven可以简化项目的构建和依赖管理&#xff0c;并提供了一种规范化和可复用的方式来管理Java项目。它广泛应用于Java开发领域&#xff0c;简单来说&#xff1a;它提供了一个简单而强大的方式来管理项目的构建、依赖关系和文档在企业级项目中被广泛采用。 1…

京东秋招攻略,备考在线测评和网申笔试

京东秋招简介 伴随着社会竞争越来越激烈&#xff0c;人们投递简历的岗位也变得越来越多元&#xff0c;而无论人们的选择面变成何样&#xff0c;那些知名度较高的企业&#xff0c;永远都备受关注&#xff0c;只要其一发布招聘公告&#xff0c;总有人第一时间踊跃报名。而作为这…

Java算法_ LRU 缓存(LeetCode_Hot100)

题目描述&#xff1a;请你设计并实现一个满足 LRU &#xff08;最近最少使用&#xff09; 缓存 约束的数据结构。 获得更多&#xff1f;算法思路:代码文档&#xff0c;算法解析的私得。 运行效果 完整代码 import java.util.HashMap; import java.util.Map;/*** 2 * Author: L…

winform中嵌入cefsharp, 并使用selenium控制

正常说&#xff0c; 需要安装的包 下面是所有的包 全部代码 using OpenQA.Selenium.Chrome; using OpenQA.Selenium; using System; using System.Windows.Forms; using CefSharp.WinForms; using CefSharp;namespace WindowsFormsApp2 {public partial class Form1 : Form{//…

(kubernetes)k8s常用资源管理

目录 k8s常用资源管理 1、创建一个pod 1&#xff09;创建yuml文件 2&#xff09;创建容器 3&#xff09;查看所有pod创建运行状态 4&#xff09;查看指定pod资源 5&#xff09;查看pod运行的详细信息 6&#xff09;验证运行的pod 2、pod管理 1&#xff09;删除pod 2…

搜索二叉树(二叉树进阶)

目录 1.二叉搜索树 1.1二叉搜索树概念 1.2二叉搜索树操作 2.3二叉搜索树的实现 2.4二叉搜索树的应用 2.5二叉搜索树的性能分析 1.二叉搜索树 1.1二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff…

mac安装nvm管理工具遇到的问题和解决方法

nvm 是一款可以管理多版本node的工具&#xff0c;因为是刚买没多久的电脑之前用的都是windows&#xff0c;昨天折腾了一下午终于倒腾好了 第一步&#xff1a; 卸载电脑已有的node&#xff1b;访问nvm脚本网址&#xff0c;另存为到电脑上任何目录&#xff0c;我是放在桌面上的…

OSPF技术入门(第三十四课)

1 OSPF的介绍 OSPF是一种链路状态路由协议,主要用于IP网络中的路由选择。它是一种开放协议,能够在不同的网络设备之间进行通信。OSPF利用链路状态数据库来描述网络拓扑结构,并通过Dijkstra算法计算出最短路径。它支持按照精确度划分的路由优先级,以及多个相等的路径,并能自…

微服务分布式搜索引擎 ElasticSearch 查询文档

文章目录 ⛄引言一、DSL查询文档⛅DSL 查询分类 二、DSL查询实例⛅全文检索查询⏰精确查询⚡地理坐标查询⌚复合查询 ⛵小结 ⛄引言 本文参考黑马 分布式Elastic search Elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海…