白书 博弈学习

nim博弈 n堆火柴,每堆有若干个火柴,两人轮流拿,每次可以选择一堆至少拿一个,也可以整堆拿走,无法拿的人输。

每堆火柴的个数异或和==0,先手输,否则先手赢。

http://acm.hust.edu.cn/vjudge/problem/32746    UVA11859

题意:给2维矩阵,每次可以选择矩阵的一行中的1个或多个大于1的整数,把他们每个数都变成真因子。  12可以变1 2 3 4 6.

解法: 等价于拿掉一个或者多个素因子,一行对应一堆火柴,每个数每个素因子看成一个火柴,即nim博弈。

 1 #include<bits/stdc++.h>
 2 #define mt(a,b) memset(a,b,sizeof(a))
 3 using namespace std;
 4 const int M=1e4+10;
 5 int a[64][64];
 6 char answer[2][8]={"NO","YES"};
 7 vector<int> prime;
 8 bool is[M];
 9 int n,m;
10 void init(){
11     mt(is,0);
12     for(int i=2;i*i<M;i++){
13         if(is[i]) continue;
14         for(int j=i*i;j<M;j+=i){
15             is[j]=true;
16         }
17     }
18     prime.clear();
19     for(int i=2;i<M;i++){
20         if(is[i]) continue;
21         prime.push_back(i);
22     }
23 //    printf("%d",prime[prime.size()-1]);
24 }
25 int solve(){
26     int nim=0;
27     for(int i=0;i<n;i++){
28         int sum=0;
29         for(int j=0;j<m;j++){
30             for(int k=0;k<prime.size();k++){
31                 if(prime[k]>a[i][j]) continue;
32                 while(a[i][j]%prime[k]==0){
33                     sum++;
34                     a[i][j]/=prime[k];
35                 }
36             }
37         }
38         nim^=sum;
39     }
40     return nim!=0;
41 }
42 int main(){
43     init();
44     int t;
45     while(~scanf("%d",&t)){
46         int cas=1;
47         while(t--){
48             scanf("%d%d",&n,&m);
49             for(int i=0;i<n;i++){
50                 for(int j=0;j<m;j++){
51                     scanf("%d",&a[i][j]);
52                 }
53             }
54             printf("Case #%d: %s\n",cas++,answer[solve()]);
55         }
56     }
57     return 0;
58 }

end

时间: 2024-08-07 06:33:47

白书 博弈学习的相关文章

雪球:普通人如何合理的理财投资,有哪些书可以学习阅读?

普通人如何合理的理财投资,有哪些书可以学习阅读? 点击进入下载-<伟大的博弈——华尔街金融帝国的崛起>(美)约翰·S·弋登.pdf 点击进入下载-<股市稳赚>(乔尔·格林布拉特).pdf 点击进入下载-[股市真规则-世界顶级评级机构的投资真经].pdf 点击进入下载-[股票投资的大智慧]最新完整版.pdf 点击进入下载-30部必读的投资学经典之06<怎样选择成长股> 菲利普_A_费雪.pdf 点击进入下载-价值投资系列之018约翰·聂夫谈价值投资.pdf经济分析史+第三

6.12白书第五章图论总结——司雨寒

之前我的图论一直都是DFS一下,BFS一下,求个欧拉回路,拓扑排个序这种渣渣水平. 终于鼓起勇气拾起白书第五章的东西. 学(bei)习(song)了一下求双连通分量,二分图的判定,强连通分量,2-SAT. DFS加上时间戳这个东西,很强大. 最后刷了白书上的例题: BCC: LA3523 可以参加会议的是双联通分量上的奇圈 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include

Uva10474-STL水题-白书

白书的一道水题.话说好久没认真做难题了.今天出了排名,所有队伍里倒数第一啊! 代码没什么可说的了. #include <algorithm> #include <cstring> #include <ctype.h> #include <cstdlib> #include <cstdio> #include <vector> #include <string> #include <queue> #include

白书 5.4.3 果园的里的树

果园里的树排列成矩阵.他们的x和y的坐标均是1~99的整数.输入若干个三角形,依次统计每个三角形内部和边界上共有多少棵树. 输入: 1.5  1.5       1.5  6.8      6.8  1.5 10.7  6.9     8.5  1.5      14.5  1.5 此题用三角形有向面积来解,求有向面积2倍的函数为: double area(double x0,double y0,double x1,double y1,double x2,double,y2) { return

白书 5.4.4 多少块土地

此题初识欧拉公式 V - E + F = 2. 其中V是顶点(即所有线段的断点数加上交点数),E是边数(即n段椭圆弧加上这些线段被切成的段数),F是面数(即土地块数加上椭圆外那个无穷大的面). ------------------------------------------------------------------------------------------------------- 有一块椭圆的地,你可以在边界上选n个点,并两两连接得到n(n-1)/2条线段.它们最多能把土地分成

白书 第九章 例 9.24 复制书稿 题解

题目解法: 题解 白书 第九章 例 9.24 复制书稿 题解,码迷,mamicode.com

分数化小数(decimal) 白书习题 2-5

1 /* 2 分数化小数(decimal) 白书习题 2-5 3 输入正整数 a , b , c , 输出 a/b 的小数形式,精确到小数点后 c 位 .a,b<=10^6 , c <= 100. 4 输入包含多组数据,结束标志为 a = b = c = 0 ; 5 */ 6 #include<stdio.h> 7 int main() 8 { 9 int a,b,c,y; //y用来存储 a/b 的余数 10 while(scanf("%d%d%d",&

当我不想看书,学习努力上进的时候我应该直面我自身的缺点

当我不想看书,学习努力上进的时候我应该直面我自身的缺点 比如我没有自己的生活目标和人生规划,未能开公司创业当上老板比如我读书少,英语不好,没有考托福雅思GRE比如我年轻的时候迷茫颓废没有上进心,在该努力的时候偷懒贪玩,白白浪费了很多时间,还给自己徒增烦恼比如我家境贫寒,买不起别墅,开不起超跑 原文地址:https://www.cnblogs.com/GaoNa/p/11095514.html

抽空通过简书网学习了一下console,感觉高大上!

抽空看了一下简书中关于console的文章,为了便于自己今后查看,自己写了一遍!原文地址:http://www.jianshu.com/p/f961e1a03a56 测试代码在最下面 1.console.log(); console.debug()与console.info()与console.log一样 (a,b,c); 可接受多个参数,中间用逗号分开,默认输出完最后输出换行符 如果第一个参数是格式字符串(使用了格式占位符),后面的参数对应前面的占位符进行输出 占位符为一下五种%d/%i %s