一个问题(玄关)
查看原帖
一个问题(玄关)
1054528
Fa_Nanf1204楼主2024/7/19 16:46
#include<bits/stdc++.h> 
#define ll long long
#define N 3000005
#define M 45
using namespace std;
ll n,k,a[M],b[M],s[N],cnt=0,ans=0,s1[N],cnt1=0,l=0,r=1e18;
ll MAX=1e18;
void dfs(int x,bool flag,ll sum){
	if(flag==0)s[++cnt]=sum;
	else s1[++cnt1]=sum;
	if(x>n){
		return ;
	}
	for (ll i=1;;i*=a[x]){
		if(MAX/i<sum) break;
		dfs(x+2,flag,sum*i);
	}
}
bool check(ll mid){
	ll l=1,r=cnt1,sum=0;
	while(l<=cnt){
		while(s1[r]>mid/s[l] and r>=1) r--;
		sum+=r;
		l++;
	}
	return sum>=k;
}
int main(){
	cin>>n;
	for (int i=1;i<=n;i++){
		cin>>a[i];
	}
	sort(a+1,a+n+1);
	cin>>k; 
	dfs(1,0,1);
	dfs(2,1,1);
	sort(s+1,s+cnt+1);
	sort(s1+1,s1+cnt1+1);
	cnt=unique(s+1,s+cnt+1)-s-1;
	cnt1=unique(s1+1,s1+cnt1+1)-s1-1;
	while(l<r){
		ll mid=l+r>>1;
		if(check(mid)){
			r=mid;
		}
		else l=mid+1;
	}
	cout<<r;
    return 0;
}

为什么 MAX/i<sumMAX/i<sum 是正确的而 MAX/sum<iMAX/sum<i 是错误的。

2024/7/19 16:46
加载中...