brz的杯子

https://ac.nowcoder.com/acm/contest/8282/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=2*2,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的二进制位数时才会存在可行的方案。

 1 #include<iostream>
 2 using namespace std;
 3 int get(int x)
 4 {
 5     int k=0;//记录变成二进制的位数
 6     while(x)//x>1就一直循环
 7     {
 8         k++;
 9         x>>=1;
10     }
11     return k;
12 }
13 int main()
14 {
15     int t=0;
16     cin>>t;
17     int ans=0;//0异或值会变为原来的值
18     for(int i=1;i<=t;i++)
19     {
20         int n,m;
21         cin>>n>>m;
22         if(m>=get(n))//判断二进制位数与m的关系
23             ans^=i;
24         else
25             ans^=i-1;//没有方案所以i-1
26     }
27     cout<<ans<<endl;
28     return 0;
29 }

 

posted @ 2020-11-08 19:19  BlackSnow  阅读(94)  评论(0)    收藏  举报