当前位置:   article > 正文

zzuli 2133_小明有n袋糖果,每次可以从所有非空的糖果袋子里分别拿出x个糖果,x大于0且小于等于每个非空袋子里糖果

小明有n袋糖果,每次可以从所有非空的糖果袋子里分别拿出x个糖果,x大于0且小于等于每个非空袋子里糖果的数量,如果想把所有糖果拿完,最少需要拿几次,使用python3编写程序

2133: 密室逃脱

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 321   Solved: 59

Submit Status Web Board

Description

XOR在玩密室逃脱,在某一关中,桌上有一个一张纸,上面写着“请根据所给例子求解答案从而获得密码”,下面写了几个字符串“01 10 11”,而答案为“6”,聪明的XOR立马就知道了这是给出一些二进制数字S,求存在多少对有序二元组(i,j)使得S[i]^S[j]<S[i],现在还有T组数据,每组是n个长度为m的二进制数字,聪明的XOR立马开始动手求解答案。

 

Input

第一行一个整数T,表示数据组数。

对于每组数据,首先读入两个整数n,m(n*m<=1000000),接下来为n行,每行为一个长度为m的01串,表示一个二进制数字

 

Output

对于每个数据,输出一个整数x,表示二元组数目

 

Sample Input

13 2011011

Sample Output

6

思路:只用考虑每个数最高位的 1 的位置,该位置最高位 1 相同的个数 a,贡献为 a * a,然后加上该位置为1但最高位 1 不是该位置的个数 (b-a),a * (b - a)(因为当x和最高位比自己大的数异或时,x只能放后面),   a*a+a*(b-a)

  1. #include <bits/stdc++.h>
  2. #define N 1000010
  3. using namespace std;
  4. long long int a[N],b[N],mark[N]; //a[i]是第i列为1且该为是最高位字符串的个数
  5. char s[N]; //b[i]是第i列为1的字符串个数
  6. int main() //mark[i] 是第i个字符串最高位 为1所在的位置
  7. {
  8. int T;
  9. scanf("%d",&T);
  10. while(T--)
  11. {
  12. int n,m,p;
  13. scanf("%d %d",&n,&m);
  14. fill(a,a+N,0);
  15. fill(b,b+N,0);
  16. fill(mark,mark+N,0);
  17. for(int i=0;i<n;i++)
  18. {
  19. scanf("%s",s);
  20. p=0;
  21. for(int j=0,t=1;j<m;j++,t++)
  22. {
  23. if(s[j]=='1')
  24. {
  25. b[t]++;
  26. if(p==0) //找到第i个字符串最高位1所在的位置
  27. {
  28. mark[i]=t;
  29. p=1;
  30. }
  31. }
  32. }
  33. }
  34. for(int i=0;i<n;i++)
  35. {
  36. a[mark[i]]++;
  37. }
  38. long long int ans=0;
  39. for(int i=1;i<=m;i++)
  40. {
  41. ans=ans+a[i]*b[i];
  42. }
  43. printf("%lld\n",ans);
  44. }
  45. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/884293
推荐阅读
相关标签
  

闽ICP备14008679号