bool check(int x,int k){
int cnt=(x/3+1)/2;
int cnt5=(x/5+1)/2;
cnt+=cnt5;
if(cnt5>1)cnt-=((cnt5-1)+2)/3;
return cnt<k;
}
void solve(){
int k;cin>>k;
int l=1,r=1e18,mid;
while(l<=r){
mid=(l+r)>>1;
if(check(mid,k))l=mid+1;
else r=mid-1;
}
cout<<l<<endl;
}
二分+容斥原理
二分最终答案x,每次判断小于等于x的数中,“奇数且是3的倍数”和 “偶数且是5结尾”的数的数量有多少即可
对于同时是奇数,3的倍数的数量,我们发现3的倍数从小到大是奇偶间隔排列的,因此除以3向下取模后再除2向上取模即可
对于同时是奇数,5的倍数的数量,我们发现5的倍数从小到大是5和0间隔排列的,因此除以5向下取模后再除2向上取模即可
这样同时满足两者的数就多算了一次,就需要减去同时满足两个条件的数,我们发现以5结尾的数中,从小到大排列后每个都相差10
,10%3==1 ,因此每次相当于在模三运算下加一,所以对于所有5的倍数从小到大排列,也是相邻三个中有一个可以,用与上面类似的方法计算即可

京公网安备 11010502036488号