一个很神奇的问题
  • 板块CF912E Prime Gift
  • 楼主xxmb
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/3/23 19:33
  • 上次更新2024/3/23 21:03:21
查看原帖
一个很神奇的问题
818000
xxmb楼主2024/3/23 19:33
#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,sumi,sum 都一定大于0)

2024/3/23 19:33
加载中...