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;
}