NC212174. brz的杯子
描述
蒟蒻 有 n 只杯子,现在 拿了一些数字,要求蒟蒻 装到杯子里。
拿了 1 ~ m 这些数字,每个数字有无限个,但每个杯子里只能放一个数。 很挑剔,对于两个编号为 x,y 的杯子,假如满足 ,那么第 x 个杯子里的数一定要比第 y 个杯子里的大。
但是小蒟蒻 不知道到底存不存在一个放数字的方案,所以只好求助于你。
输入描述
第一行一个整数,表示有T次询问。
每组询问内有两个整数n,m,意义如上所述。
输出描述
对于第 i 个询问,如果存在一个放数字的方案,那么贡献为 i,否则为 i-1,令 ans 等于所有询问的贡献异或和,最后你只需要输出 ans 即可。
示例1
输入:
2 3 3 2 1
输出:
0
说明:
对于第一组样例,可以在第一个杯子里放 1,在第二个杯子里放 2,在第三个杯子里放 3,贡献为 1。
对于第二组样例,在第一个杯子里放 1 后,由于第二个杯子里的数要比第一个杯子里的数大,但是又没有比 1 大的数可以放了,所以不存在一种方案,贡献为 2-1=1。
答案为 1 xor 1=0。
C++(clang++11) 解法, 执行用时: 292ms, 内存消耗: 388K, 提交时间: 2020-11-06 19:10:41
#include<bits/stdc++.h> using namespace std; int t,n,m,ans; int main(){ scanf("%d",&t); for(int i=0;i<t;i++){ scanf("%d%d",&n,&m); ans^=log2(n)<m?i+1:i; } printf("%d",ans); return 0; }
pypy3(pypy3.6.1) 解法, 执行用时: 1625ms, 内存消耗: 32280K, 提交时间: 2020-11-07 21:00:57
ans=0 for _ in range(1,int(input())+1): n,m=map(int,input().split()) if(n.bit_length()<=m): ans^=_ else: ans^=_-1 print(ans)