博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P4301 [CQOI2013]新Nim游戏(线性基)
阅读量:5797 次
发布时间:2019-06-18

本文共 977 字,大约阅读时间需要 3 分钟。

 

 

不知道线性基是什么东西的可以看看蒟蒻的

后手在什么时候能够获胜呢?只有在他能构造出一个子集的异或和为0时(这个应该是nim博弈的结论了吧)

那么为了必胜,我们就要取到没有子集异或和为0为止

那就是构造一个线性无关,那么构造线性基即可

然后还有一个问题就是石子要取得最小,那么就是留下来的要最大,就是被加进线性基中的要最大

考虑贪心,从大到小取石头,如果不能被线性基中的数表示那么就加入线性基,否则这堆石子就要取走

据说贪心的证明得用拟阵,我还是不会

1 //minamoto 2 #include
3 #include
4 #define ll long long 5 using namespace std; 6 const int N=105; 7 ll b[65],a[N],ans;int n; 8 inline void insert(ll x){ 9 for(int i=63;i>=0;--i)10 if(x>>i&1){11 if(!b[i]) return (void)(b[i]=x);12 x^=b[i];13 }14 }15 inline bool find(ll x){16 for(int i=63;i>=0;--i)17 if(x>>i&1){18 if(!b[i]) break;19 x^=b[i];20 }21 return x;22 }23 int main(){24 scanf("%d",&n);25 for(int i=1;i<=n;++i) scanf("%lld",&a[i]);26 sort(a+1,a+1+n);27 for(int i=n;i;--i)28 if(find(a[i])) insert(a[i]);29 else ans+=a[i];30 printf("%lld\n",ans);31 return 0;32 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9720762.html

你可能感兴趣的文章
4、加载:Loading
查看>>
Program to Print Pascal Triangle
查看>>
matlab 标识符查找过程
查看>>
知识点(杂)
查看>>
netstat 查看本机开放端口
查看>>
串口编程-485
查看>>
Shell函数参数
查看>>
讯为iTop4412嵌入式开发板学习之-------前言
查看>>
彩笔在kali安装 veil 的过程 and 使用
查看>>
java myeclipse 安装svn插件
查看>>
Web安全测试-WebScarab
查看>>
css学习笔记(1)
查看>>
NOIP动态规划大合集
查看>>
深度学习的GDB调试命令和经验记录
查看>>
结队编程练习 2
查看>>
Cygwin/Git与Git Source Control Provider结合时初始目录
查看>>
python count()函数
查看>>
(重要) html概念之 input:name与id详解
查看>>
IIS日志分析
查看>>
java_小技巧
查看>>