小编Rob*_* Yu的帖子

给定范围内的总和和乘积

给出四个正整数 S_1, S_2, P_1P_2,有没有办法快速找到任何两个整数 一个b 这样:

  • S_1\leq a + b\leq S_2,和
  • P_1\leq ab\leq P_2

什么时候 S_1 = S_2P_1 = P_2,有一个封闭的形式 O(1)使用二次方程解决这个问题.我们只需找到根源a ^ 2  -  S_1*a + P_1 它会给我们一个合适的 一个.

什么时候 S_1 = S_2,我知道如何解决它 O(日志S_1) 通过注意到曲线 f(a)= a(S_1  -  a) 是凸的,所以我们可以二元搜索一个合适的 一个.

什么时候 P_1 = P_2,它可以解决 O(sqrt P_1) 通过保理 P_1 并寻找一对总和到该范围内的值的因子.

然而,当它们都是范围时,我想不出任何可以有效解决这个问题的算法.有一些可能的启发式方法,比如修复两个中的一个(迭代较小的范围等),或立即报告当可以用两个整数求和的最大可能产品时不存在对S_2 小于 P_1

不幸的是,我无法想出任何能够在一般情况下工作的东西,而不是迭代任何一件事 O(| S_2-S_1 |) 要么 O(| P_2-P_1 |)(可能有一些额外的小因素).是否有一个很好的算法,或一些花哨的数学,提供更快的解决方案?

或者,有没有办法证明迭代很快终止?(在处理了一些角落案件等之后)我对有效对的数量不感兴趣; 找到任何一对都会.如果允许总和的范围足够大,似乎迭代产品并试图找到相应的和趋向于快速找到解决方案.可以有某种证据吗?

我非常感谢任何帮助!

algorithm math

6
推荐指数
1
解决办法
280
查看次数

Mo的算法计算阵列的"功率"

最近,我学习了Mo的查询平方根分解算法,以加快某些问题的解决方案.

为了实现实现,我一直在尝试使用这个想法来解决D.强大的数组(Codeforces上的过去的竞争问题).问题如下:

你有一个数组 ñ 整数 排列.

考虑一个任意的子阵列 子阵.限定KS 是整数的出现次数 小号在这个子阵列中.子阵列的功率定义为.的总和KS*KS*S 对于所有整数 小号 (请注意,只有正数的术语不是零).

回答 q查询.在每个查询中,给出两个整数升[R,计算功率子阵.

它拥有:

limits1
limits2
limits3

使用Mo的算法,我编写了代码,可以离线解决这个问题 复杂.我确信使用这种算法和时间复杂度可以解决这个问题,因为我已经检查了其他人接受的代码,他们也使用了类似的算法.

但是,我的代码获得了超出时间限制的判决.

以下是我写的代码:

#include <ios>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <utility>
#include <map>

int sqt;
long long int ans = 0;
long long int arr[200005] = {};
long long int cnt[1000005] = {};
long long int tans[200005] = {};

struct el
{
    int l, r, in; …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm data-structures

5
推荐指数
1
解决办法
445
查看次数

一个以模数为模的字符串的不同排列

我最近想到了以下问题,我很惊讶似乎没有人问过这个问题:

给定一个字符串,存在多少个不同的排列,以模为单位 1000000007

我知道这个公式 式 哪里 ñ 是字符串的长度,和 A1A2AK 是每个角色的数量(考虑大小的字母表 ķ).所以,字符串toffee会有180 不同的排列.

但是这不再适用了 ñ 可能真的很大(比如说 100000),自计算 Nfactorial会超出long long int的范围,使用BigIntegers会太慢.有没有办法计算这个,比方说,ñ 要么 NlogN 时间?

如果我预处理了因子 1ñ,我的"字符串"以长度数组的形式出现 ķ 其中每个元素包含每个字母的计数,是否可以计算它 ķ 要么 KlogK 时间?

将不胜感激任何帮助:)

algorithm math

4
推荐指数
1
解决办法
603
查看次数

标签 统计

algorithm ×3

math ×2

c++ ×1

data-structures ×1