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 }

浙公网安备 33010602011771号