白书 博弈学习
2016-07-20 16:42
239 查看
nim博弈 n堆火柴,每堆有若干个火柴,两人轮流拿,每次可以选择一堆至少拿一个,也可以整堆拿走,无法拿的人输。
每堆火柴的个数异或和==0,先手输,否则先手赢。
http://acm.hust.edu.cn/vjudge/problem/32746 UVA11859
题意:给2维矩阵,每次可以选择矩阵的一行中的1个或多个大于1的整数,把他们每个数都变成真因子。 12可以变1 2 3 4 6.
解法: 等价于拿掉一个或者多个素因子,一行对应一堆火柴,每个数每个素因子看成一个火柴,即nim博弈。
View Code
end
每堆火柴的个数异或和==0,先手输,否则先手赢。
http://acm.hust.edu.cn/vjudge/problem/32746 UVA11859
题意:给2维矩阵,每次可以选择矩阵的一行中的1个或多个大于1的整数,把他们每个数都变成真因子。 12可以变1 2 3 4 6.
解法: 等价于拿掉一个或者多个素因子,一行对应一堆火柴,每个数每个素因子看成一个火柴,即nim博弈。
#include<bits/stdc++.h> #define mt(a,b) memset(a,b,sizeof(a)) using namespace std; const int M=1e4+10; int a[64][64]; char answer[2][8]={"NO","YES"}; vector<int> prime; bool is[M]; int n,m; void init(){ mt(is,0); for(int i=2;i*i<M;i++){ if(is[i]) continue; for(int j=i*i;j<M;j+=i){ is[j]=true; } } prime.clear(); for(int i=2;i<M;i++){ if(is[i]) continue; prime.push_back(i); } // printf("%d",prime[prime.size()-1]); } int solve(){ int nim=0; for(int i=0;i<n;i++){ int sum=0; for(int j=0;j<m;j++){ for(int k=0;k<prime.size();k++){ if(prime[k]>a[i][j]) continue; while(a[i][j]%prime[k]==0){ sum++; a[i][j]/=prime[k]; } } } nim^=sum; } return nim!=0; } int main(){ init(); int t; while(~scanf("%d",&t)){ int cas=1; while(t--){ scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&a[i][j]); } } printf("Case #%d: %s\n",cas++,answer[solve()]); } } return 0; }
View Code
end
相关文章推荐
- KMP算法的思考
- Espresso basics
- 四、使用SDk对ZYNQ调试
- HDOJ 1050 Moving Tables
- oc ios ,json,TableView(listView)
- 指针也是一种数据类型
- DB2使用命令行连接远程数据库(DB2客户端工具使用教程)
- NIO学习笔记三
- [Leetcode]228. Summary Ranges
- java 实现回调代码实例
- 常见的网站服务器架构有哪些?
- mysql,实现数据库检索结果添加自增的序号
- poj 1634 简单数据结构
- Android 中的 AOP 编程
- 验证码识别基础方法及源码
- Toolbar细节运用
- shell脚本异常“bash: ./rebuild.sh: /bin/sh^M: bad interpreter: No such file or directory”
- javascript弹出层输入框
- Android测试工具Espresso简介
- IP, ARP, RIP和BGP协议