题意:
给定整数n,要求找到一个最小的整数k,满足对于集合{1,2,3…n}的任意大小为k的子集,都存在两个不同的数,其中一个数是另一个数的因子。
数据范围:2<=n<=1e9
解法:
反过来想找到一个最大的k,存在大小为k的子集,没有一个数是另一个数的因子
如果选择了x,那么就不能选择2x,所以范围为[x,2x-1],区间长度为x,
找到一个最大的x,满足2*x-1<=n即可
那么答案就是x+1
ps:
x可以O(1)算,但是我懒得推式子,用了二分
code:
#include<bits/stdc++.h>
using namespace std;
#define long long ll
const int maxm=1e6+5;
signed main(){
int T;cin>>T;
while(T--){
int n;cin>>n;
int ans=-1;
int l=1,r=n;
while(l<=r){
int mid=(l+r)/2;
if(mid*2-1<=n){
ans=mid,l=mid+1;
}else{
r=mid-1;
}
}
cout<<ans+1<<endl;
}
return 0;
}