首页 > 其他分享 >Codeforces - 1744E2 - Divisible Numbers (hard version)(数论 + 暴力 + 思维 、 *1900)

Codeforces - 1744E2 - Divisible Numbers (hard version)(数论 + 暴力 + 思维 、 *1900)

时间:2022-10-24 13:35:27浏览次数:85  
标签:10 matrix 1744E2 Divisible hard 因数 pmb 式子

1744E2 - Divisible Numbers (hard version)(⇔源地址



目录

本文参考:这位大佬的思路严格鸽的证明






tag

⇔数论、⇔暴力、⇔思维、⇔*1900。


题意

给出四个数 \(a,b,c,d\) ,请你找到任意一对 \(\{X,Y\}\) ,使得满足:

  • \(a<X\le c,b<Y\le d\) ;
  • \(X*Y\) 是 \(a*b\) 的倍数。

思路

正解

由题目条件,能够得到 \(X*Y=K*a*b(1 < K)\),我们将 \(a、b\) 拆分为 \(a=x_1*y_1,b=x_2*y_2\) ,那么式子就变成 \(X*Y=K*x_1*x_2*y_1*y_2\) 。我们可以分解出 \(a、b\) 的全部因数,然后暴力枚举,代入式子中求解。

下面讨论如何代入式子中得到答案。假设我们枚举出来的因数是 \(y1、y2\) ,那么通过 \(a*b=x_1*x_2*y_1*y_2\) 可以得到 \(x_1*x_2=\dfrac{a*b}{y_1*y_2}\) 。这个时候,我们的 \(K\) 并没有参与计算,我们再拆分 \(K=k_1*k_2\) ,使得\(\left\{\begin{matrix} Y=k_1*y_1*y_2 \\ X=k_2*x_1*x_2 \end{matrix}\right.\) ,那么如何找到最小的符合条件的 \(X、Y\) 呢?

以求解 \(Y\) 为例,我们整理一下已经有的东西:已知有 \(\left\{\begin{matrix} b < Y \le d \\ Y是 y1*y2的倍数 \\ b、d、y1、y2已知 \end{matrix}\right.\) ,那么大于 \(b\) 的最小的 \(Y\) 即为 \(\left \lfloor \dfrac{b}{y_1*y_2} + 1 \right \rfloor * y_1*y_2\) ,只需要将其与 \(d\) 再做一次比较即可。\(X\) 同理。

分析正确性:使用试除法分解因数,\(\mathcal O(\sqrt N)\) ;而 \(10^9\) 以内的数字的因数最多的数量为 \(1344\) ,所以使用暴力枚举,\(\mathcal O(1344^2)\) ;最后一步暴力求解的复杂度为 \(\mathcal O(1)\) ,能够通过。

附:因数数量表

\(\pmb {n \le}\) \(\pmb {10^1}\) \(\pmb {10^2}\) \(\pmb {10^3}\) \(\pmb {10^4}\) \(\pmb {10^5}\) \(\pmb {10^6}\) \(\pmb {10^7}\) \(\pmb {10^8}\) \(\pmb {10^9}\)
\(\pmb {最大因数数量}\) 4 12 32 64 128 240 448 768 1344

后日谈

在查阅资料时,发现有很多人都是使用 \(\tt dfs\) 来替代\(a*b=x_1*x_2*y_1*y_2\) 这一步的,其本质思路是一致的,而 \(\tt dfs\) 码量较多,故这里不再单独写一份代码。这题对于数学的思维要求极高,就我而言,用式子直接计算“大于 \(b\) 的最小的 \(Y\) ”这一步可能比较难以想到,但是看过式子之后也就感觉不过如此,还是经验的问题,总的来说只要想到了正确方法,这道题就是纯打卡题了。


AC代码

点击查看代码
set<int> clac(int x) {
    set<int> num;
    for (int i = 1; i <= x / i; ++ i) {
        if (x % i == 0) num.insert(i), num.insert(x / i);
    }
    return num;
}
void Solve() {
    int a, b, c, d; cin >> a >> b >> c >> d;
    set<int> num1 = clac(a), num2 = clac(b);
    
    for (auto i : num1) {
        for (auto j : num2) {
            int x = i * j;
            int y = a * b / x;
            x = (a / x + 1) * x;
            y = (b / y + 1) * y;
            if (a < x && x <= c && b < y && y <= d) {
                cout << x << " " << y << endl;
                return;
            }
        }
    }
    cout << -1 << " " << -1 << endl;
}

错误次数:2






文 / WIDA
2022.10.24 成文
首发于WIDA个人博客,仅供学习讨论



标签:10,matrix,1744E2,Divisible,hard,因数,pmb,式子
From: https://www.cnblogs.com/WIDA/p/16821176.html

相关文章

  • Codeforces Round #830 (Div. 2)D2. Balance (Hard version)(数据结构)
    题目链接题目大意维护一个集合的mex,每次有三种操作:'+'x:将数x插入集合中'-'x:将数x移除集合'?'k:询问满足mex的数是k的倍数既集合中未出现的数中最小的数......
  • [Typescript] 64. Hard - AllCombinations
    Implementtype AllCombinations<S> thatreturnallcombinationsofstringswhichusecharactersfrom S atmostonce.Forexample:typeAllCombinations_ABC=......
  • P8201 生活在树上(hard version)
    这是一篇大量利用STL的题解。1、题意转化原题说了非常多的路径费用定义,不妨直接画图来研究一下:手摸一下可以发现,对于上图中\(t_1\)、\(t_2\)、\(t_3\)、\(t_4\)四个......
  • Heidi and Library (hard) | CodeForces 802C最大流最小费用
    神仙题,想了两节ds课没想出来,跑到奇怪的犄角旮旯去了还是没法搞一个满意的模型看了洛谷黑题啊..释然了思路和细节在代码//LUOGU_RID:90857083#include<bits/stdc++.h......
  • ShardingSphere的配置中心
    ShardingSphere的配置中心本篇文章源码基于4.0.1版本使用配置中心来管理配置文件非常方便灵活,实现配置信息的动态加载,ShardingSphere支持很多配置中心,包括Apollo、Zooke......
  • ShardingSphere的注册中心
    ShardingSphere的注册中心本篇文章源码基于4.0.1版本注册中心在ShardingSphere的作用就是用来管理各种数据源,在使用的时候,所有数据源通过向注册中心的指定目录下创建节......
  • ShardingSphere与链路追踪
    ShardingSphere与链路追踪本篇文章源码基于4.0.1版本ShardingSphere的功能非常强大,它不仅与注册中心、配置中心相结合的很好,它还支持链路追踪,了解过链路追踪技术的肯定......
  • E2. Divisible Numbers (hard version)
    E2.DivisibleNumbers(hardversion)Thisisanhardversionoftheproblem.Theonlydifferencebetweenaneasyandahardversionistheconstraintson$a,b......
  • Codeforces Round #757 (Div. 2) - D2. Divan and Kostomuksha (hard version)
    GCD+DP+调和级数/埃式筛[Problem-D-Codeforces](https://codeforces.com/contest/1610/problem/D)题意给出一个长度为\(n\;(1<=n<=10^5)\)的数组\(a[i]\;(1<......
  • Codeforces Round #828 (Div. 3) E1. Divisible Numbers (easy version)(数学/暴力)
    https://codeforces.com/contest/1744/problem/E1题目大意:给定a,b,c,d;让我们选择从(a,b]中选出一个x,在(c,d]中选出一个y;满足(x*y)/(a*b)是一个整数。input51......