1105 第K大的数

数组A和数组B,里面都有n个整数。数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ......A[1] * B[0],A[1] * B[1]......A[n - 1] * B[n - 1](数组A同数组B的组合)。求数组C中第K大的数。
例如:A:1 2 3,B:2 3 4。A与B组合成的C包括2 3 4 4 6 8 6 9 12共9个数。
Input
第1行:2个数N和K,中间用空格分隔。N为数组的长度,K对应第K大的数。(2 <= N <= 50000,1 <= K <= 10^9)
第2 - N + 1行:每行2个数,分别是A[i]和B[i]。(1 <= A[i],B[i] <= 10^9)
Output
输出第K大的数。
Input示例
3 2
1 2
2 3
3 4
Output示例

9





#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstring>
using namespace std;
long long a[50010],b[50010];
long long m,n;
long long key,i,j;
long long low,high;
long long mid,temp;
long long fun(long long k)
{
    long long ans=0;
    j=m;
    for(i=1;i<=m;i++)
    {
        for(;j>0;j--)
        {
            if(a[i]*b[j]<=k)
            break;
        }
        ans+=j;
        //cout<<ans<<endl<<endl;
    }
    return ans;
}
int main()
{
    cin>>m>>n;


    for(i=1;i<=m;i++)
    {
        cin>>a[i]>>b[i];
        //cout<<a[i]<<" "<<b[i]<<endl;
    }


    sort(a+1,a+m+1);
    sort(b+1,b+m+1);


    low=a[1]*b[1];
    high=a[m]*b[m];
    key=m*m-n+1;
    temp=0;


    while(high>low+1)
    {
        mid=low+(high-low)/2;
        if(fun(mid)>=key)
        {
            high=mid;
            temp=mid;
        }
        else low=mid;
    }
    cout<<temp<<endl;
    return 0;
}

<think>好的,用户现在需要一组小于3×10&sup2;⁷的,用于素判断或筛选。首先,我需要回顾之前的对话提供的引用内容,确保给出的建议符合用户的需求。用户之前的问题是关于如何判断超过2^100的是否为素,我推荐了米勒-拉宾测试,并给出了代码示例。现在用户转向寻找小于3e27的用于素筛选或测试,可能需要生成这样的集,或者推荐特定的以便测试。首先,分析引用内容。引用[1]提到埃拉托斯特尼筛法的基本步骤,引用[3]讨论了试除法的优化,引用[4]给出埃式筛法的代码。用户可能希望生成一组,这些适合用于素测试,比如包含已知素、边界情况、特定结构的,或者随机。接下来,用户的需求是“推荐一组”,可能需要这些具有代表性,便于测试筛选算法或判断算法的效率。考虑到3e27是一个非常的范围,直接生成所有素不现实,因此需要推荐有代表性的测试用例。可能的推荐包括: 1.已知:如已知的梅森素,虽然3e27可能超出当前已知的梅森素范围,但可以调整。 2.伪素:例如卡迈克尔,用于测试概率算法的准确性。 3.接近3e27边界的,检查算法的处理能力。4.特定结构的,如形如2^n±1,或加减小,便于分解测试。 5.随机生成的,用于一般性测试。需要确保推荐的据集覆盖不同情况,帮助验证算法的正确性效率。同时,考虑到用户之前提到的米勒-拉宾测试,可能需要包含一些容易误判的合,测试算法的鲁棒性。 此外,引用[3]提到试除法的优化到sqrt(n),但面对3e27这样,传统试除法不适用,因此用户可能需要高效的筛选或测试方法,如分段筛或概率测试。 最后,生成相关问题,引导用户进一步探讨,如如何生成、优化筛法在上的应用等。</think>### 推荐测试集(小于$3 \times 10^{27}$) 针对素筛选或测试需求,以下推荐具有学意义的集: --- #### **一、特殊结构** 1. **梅森形式** $$M_p = 2^p - 1 \quad (p \text{为素})$$ 例如: - $p=89$时,$M_{89}=2^{89}-1 \approx 6.18 \times 10^{26}$ - $p=97$时,$M_{97}=2^{97}-1 \approx 1.58 \times 10^{29}$(超出范围,需调整) 2. **广义费马** $$F_{k,n} = 2^{2^k} + n$$ 例如: - $F_{5,1} = 2^{32} + 1 \approx 4.29 \times 10^9$(可扩展更高$k$) 3. **素间隙附近** 如$n! \pm 1$(需保证$n! < 3 \times 10^{27}$),例如: - $25! \approx 1.55 \times 10^{25}$ - $30! \approx 2.65 \times 10^{32}$(超出范围) --- #### **二、预计算素** 1. **已知** - 从[PrimePage](https://primes.utm.edu/)获取已验证的素,例如: - $2^{82,589,933} - 1$(当前最已知梅森素,但远超出$3 \times 10^{27}$) - 调整范围至$3 \times 10^{27}$内的类似候选2. **伪素(测试算法鲁棒性)** 如卡迈克尔(Carmichael numbers): - $561$, $1105$, $1729$等(需生成更范围版本)[^3] --- #### **三、随机生成** 1. **均匀分布随机** ```python import random def generate_large_number(max_exp=27): digits = random.randint(1, 27) # 位控制 return random.randint(10**digits, 3*10**27) ``` 2. **边界附近** - $3 \times 10^{27} - k$($k$取小整数,如1,2,3) --- #### **四、集示例表** | 类型 | 示例值(科学计法) | 用途 | |--------------|--------------------------|--------------------------| | 梅森 | $2^{89}-1 \approx 6.18 \times 10^{26}$ | 测试特殊结构素判定 | | 卡迈克尔 | $10^{20} + 1$ | 验证概率算法误判率 | | 随机 | $1.24 \times 10^{27}$ | 常规素性测试基准 | | 边界 | $3 \times 10^{27} - 7$ | 检查算法溢出处理能力 | --- ### **选择依据** 1. **学意义**:覆盖特殊结构(如梅森伪素,验证算法准确性[^1][^3]。 2. **性能测试**:随机边界用于评估算法在场景下的效率。 3. **兼容性**:确保集兼容常见筛法(如埃拉托斯特尼筛法的分段优化)概率测试(如米勒-拉宾)[^4]。 --- ### **生成工具** 对规模集,建议使用**符号计算库**(如SymPy)生成: ```python from sympy import randprime n = randprime(10**26, 3*10**27) # 生成指定范围内的随机素 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值