A题

brz的杯子

https://ac.nowcoder.com/acm/contest/8282/A

A题

y|x 是能够整除的意思(这谁能想的出来)
我们来找一下规律(这其实是一道思维题),在选择数字放到瓶子里时应采用在满足约束条件的情况下尽可能的原则

1,1能被所有数字整除,所以第一个位置我们放最小的1,num[1]=1
2,2整除1,所以放比num[1]大的数,放最小的2,num[2]=2,其实所有的质数都只能整除1,所以质数放2即可
3,质数,num[3]=2
4,4=22,num[4]>num[2]=2,num[4]=3;
5,质数,num[5]=2
6,6=2
3 num[6]>num[2]=2,num[6]=3;
7,质数,num[7]=2
8,8=2*4,num[8]>num[4]=3,num=4;
……
最终得到下面的数列

位置:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17
数字:1,2,2,3,2,3,2,4,3, 3, 2, 4, 2, 3, 3, 5, 2

请着重注意1,2,4,8,16,这几个位置,
发现每到下标为2的幂的位置,所需要的最大数都会加1,这个数字等价于下标二进制的位数。
所以对于n个瓶子,只有当m>=n的二进制位数时才会存在可行的方案。
代码如下

#include <iostream>
using namespace std;
int t,n,m;
int get(int x){
    int k=0;
    while(x){
        k++;
        x>>=1;
    }
    return k;
}
int main(){
    cin>>t;
    int ans=0; 
    for(int i=1;i<=t;i++){
        cin>>n>>m;
        if(m>=get(n))ans^=i;
        else ans^=i-1;
    }
    cout<<ans;
    return 0;
}
全部评论
这数学常识oiwiki数学篇前置知识
点赞 回复 分享
发布于 2020-11-09 20:42

相关推荐

头像 会员标识
10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
评论
6
收藏
分享
牛客网
牛客企业服务