#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,a[20],k,l,r,mid,ma,mb;
vector<int> ida,idb;
void dfs1(int x,int sum){
ida.push_back(sum);
if(x>n) return ;
for(int i=1;i<=1e18/sum&&sum<=1e18/i;i*=a[x])
dfs1(x+2,i*sum);
}
void dfs2(int x,int sum){
idb.push_back(sum);
if(x>n) return ;
for(int i=1;i<=1e18/sum&&sum<=1e18/i;i*=a[x])
dfs2(x+2,i*sum);
}
int check(int x){
int j=mb-1,sum=0;
for(int i=0;i<ma;i++){
while(j>=0&&idb[j]>x/ida[i])
j--;
sum+=j+1;
}
return sum;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
scanf("%lld",&k);
dfs1(1,1); dfs2(2,1);
sort(ida.begin(),ida.end());
sort(idb.begin(),idb.end());
auto aa=unique(ida.begin(),ida.end()); ida.erase(aa,ida.end());
auto bb=unique(idb.begin(),idb.end()); idb.erase(bb,idb.end());
ma=ida.size(),mb=idb.size();
l=0,r=1e18;
while(l<r){
mid=l+r>>1;
if(check(mid)<k)
l=mid+1;
else r=mid;
}
cout<<r;
return 0;
}
为什么这两个代码中的 i<=1e18/sum&&sum<=1e18/i 把其中的 sum<=1e18/i 去掉就错了呢?想了半天没想明白。(注:i,sum 都一定大于0)