C. Maximum Set[数学] [*1300-*1500]
C. Maximum Set[数学] [*1300-*1500]
题意:
一个集合是漂亮的,如果他的每一个元素都是集合中其他元素的倍数或者因子
给定你一个
让你找出在
并给出元素数量最多的集合的数目
思路:
如果每一个元素都是其他元素的倍数或者因子
我们定义
那么我们可以发现,当倍数都是2时,对答案的贡献率
也就是到相同的长度需要的元素大小最小(可以观察发现,不再进行证明)
但是
还有一种特殊情况
也就是比如说 在
从
如果将其中的一个2倍替换成3倍呢
那么
我们发现也是可以成立的
如果将两个2倍替换成3倍呢
我们可以发现
所以如果存在这种情况我们就可以将 两个3替换成三个2
从而让集合的长度加一
那么我们将其中的一个2倍替换成4倍呢
这种情况就不行了
为什么呢?
因为4倍可以拆成两个2倍,也就是在元素大小相同的情况下,2倍可以让集合的长度更长
所以也就是不存在的
大于4的情况因为
所以也都是不存在的
那么我们就将情况化简成立了仅有全是2 和 仅有一个3的情况
那么就可以愉快的解决这道问题了
key code
int l,r;
void solve(){
//try it again.
cin>>l>>r;
int k=0;
while((1<<k)*l<=r)k++;k--;
int ans=(r>>k)-l+1;
if(k>0){
r>>=k-1;
r/=3;
if(r>=l)ans+=k*(r-l+1);
}
cout<<++k<<" "<<ans<<endl;
}
本文作者:liangqianxing
本文链接:https://www.cnblogs.com/liangqianxing/p/17168253.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步