Number

206 篇文章 0 订阅
64 篇文章 0 订阅

Description
有N(2<=N<=15)个数A1,A2,…,An-1,An,如果在这N个数中,有且仅有一个数能整除m,那么整数m就是一个幸运数,你的任务就是在给定A1,A2,…,An-1,An的情况下,求出第k小的幸运数。

Input
第一行为一整数数N,K(2<=N<=15,1<=K<=2^31-1),意义如上述。
接下来一行有N个整数,A1,A2,…,An-1,An,这N个整数均不超过2^31-1。

Output
输出一行,仅包含一个整数ans,表示第K小的幸运数。答案保证不超过10^15。

Sample Input
输入1:
2 4
2 3

输入2:
2 100
125 32767

Sample Output
输出1:
8

输出2:
12500

Data Constraint

Hint
对于50%的数据,N<=5,ANS<=100000
对于80%的数据,N<=10,ANS<=10^15
对于100%的数据,N<=15,ANS<=10^15

.
.
.
.
.
分析
在这里插入图片描述

.
.
.
.
.
程序:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

int n;
long long a[17],tj,mid;

long long gcd(long long x,long long y)
{
    if (y==0) return x; else return gcd(y,x%y);
}

void dfs(int wz,long long w,int x)
{
	if (w>mid) return;
	if (x%2==0) tj-=floor(mid/w)*x; else tj+=floor(mid/w)*x;
    for (int i=wz+1;i<=n;i++)
        dfs(i,w/gcd(w,a[i])*a[i],x+1);
}

int main()
{
	long long k;
    scanf("%d%lld",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    long long l=1,r=1000000000000000;
    while (l<r)
    {
        mid=(l+r)/2;
        tj=0;
        for (int i=1;i<=n;i++)
			dfs(i,a[i],1);
        if (tj<k) l=mid+1; else r=mid;
    }
    printf("%lld",l);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值