记录编号 140098 评测结果 AAAAAAAAAA
题目名称 [CQOI2013]新Nim游戏 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.011 s
提交时间 2014-11-19 10:00:12 内存使用 0.33 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<vector>
  6. using namespace std;
  7. typedef long long LL;
  8. const int SIZE=110,BTN=31;
  9. bool Gauss_Jordan(bool A[SIZE][SIZE],int n,int m){//是否有解
  10. //行数0~n-1,列数0~m(m这一列是常数)
  11. for(int i=0;i<n&&i<m;i++){
  12. int p=i;
  13. for(int k=i+1;k<n;k++) if(A[k][i]>A[p][i]) p=k;
  14. if(!A[p][i]) continue;
  15. for(int k=0;k<=m;k++) swap(A[i][k],A[p][k]);
  16. for(int j=0;j<n;j++){
  17. if(j==i||!A[j][i]) continue;
  18. for(int k=0;k<=m;k++) A[j][k]^=A[i][k];
  19. }
  20. }
  21. //两种0=1的姿势
  22. for(int i=0;i<n&&i<m;i++)
  23. if(A[i][i]==0&&A[i][m]!=0) return false;
  24. for(int i=m;i<n;i++)
  25. if(A[i][m]!=0) return false;
  26. return true;
  27. }
  28. int N;
  29. int A[SIZE]={0};
  30. vector<int> stay;
  31. bool G[SIZE][SIZE];
  32. bool check(int x){
  33. if(stay.size()==0&&x) return false;//总之不可能表示
  34. memset(G,0,sizeof(G));
  35. int n=BTN,m=stay.size();
  36. for(int i=0;i<n;i++){//第i位
  37. for(int j=0;j<m;j++) G[i][j]=(stay[j]>>i)&1;
  38. G[i][m]=(x>>i)&1;
  39. }
  40. return Gauss_Jordan(G,n,m);
  41. }
  42. void work(void){
  43. sort(A+1,A+1+N);
  44. LL ans=0;
  45. for(int i=N;i>=1;i--){//从大到小试图留下
  46. if(check(A[i])) ans+=A[i];//可以被表示,不在线性无关的向量组中
  47. else stay.push_back(A[i]);
  48. }
  49. printf("%lld\n",ans);
  50. }
  51. void read(void){
  52. scanf("%d",&N);
  53. for(int i=1;i<=N;i++) scanf("%d",&A[i]);
  54. }
  55. int main(){
  56. freopen("newnim.in","r",stdin);
  57. freopen("newnim.out","w",stdout);
  58. read();
  59. work();
  60. return 0;
  61. }