题面如下:

代码:
#include<iostream>
#include<set>
using namespace std;
unsigned long long a[20][20],s[20];
set<unsigned long long>b[20];
unsigned long long gcd(unsigned long long n,unsigned long long m)
{
if(n%m==0)
return m;
else
return gcd(m,n%m);
}
unsigned long long lcm(unsigned long long n,unsigned long long m)
{
return n*m/gcd(n,m);
}
int main()
{
unsigned long long n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
unsigned long long t;
cin>>t;
a[1][i]=t;
b[1].insert(t);
}
s[1]=n;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=s[i-1];j++)
for(int k=j+1;k<=s[i-1];k++)
if(lcm(a[i-1][j],a[i-1][k])<=1e15)
a[i][++s[i]]=lcm(a[i-1][j],a[i-1][k]);
for(int j=1;j<=s[i];j++)
b[i].insert(a[i][j]);
}
unsigned long long l=1,r=1e15,mid,ans=1e16;
while(l<r)
{
mid=(l+r)/2;
unsigned long long t=0;
for(int i=1;i<=n;i++)
{
for(set<unsigned long long>::iterator j=b[i].begin();j!=b[i].end();j++)
{
if(i%2==1)
t+=mid/(*j);
else
t-=i*(mid/(*j));
}
}
if(t<k)
l=mid+1;
else
{
if(t==k)
ans=min(ans,mid);
r=mid;
}
}
cout<<ans<<endl;
}
WA 30