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=23 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; }