Description

现在有一个博弈游戏。
有n堆石子,每堆石子的数量在  之间,其中 .
先手先从中选出连续K堆石子,删掉其他的所有堆。
后手接着删去任意堆石子,可以不删,但是不能全删。
然后两人开始玩NIM游戏。
求后手必胜的初始局面数量。

Difficulty

★★★

Main Algorithm

DP 矩乘加速
线性代数
博弈论

Complexity

Solution

挺有意思的。
我们发现关键是后手删去任意堆石子后,剩下的石子异或和为0.
即先手取了任意连续K堆石子后,都存在一组数使得异或和为0.
那么就继续用线性代数来描述。题目变为求长度为n,每个数均在1~m之间,任意连续K个数线性相关的序列个数。
显然的当  的时候,任意K个数必然是线性相关的,那么答案就是 
当  的时候,直接做似乎不好做,线性相关这个东西看上去并不容易压入状态。
那么补集转化为求存在某K个数线性无关的序列个数。
这样,对线性无关的讨论似乎更方便,因为线性无关组中一个数所控制的位仅一位。
设  表示考虑了前i个数,且恰好后j个数线性无关的序列个数。
考虑新加入一个数。
假如这个数与后j个数都线性无关,那么除了只在这j位为1的数之外,都可以选。
.
假如这个数与后v个数线性无关,但是与后v+1个数线性相关:
那么这个数在从后数第v+1个数控制的位上是1,除了后v+1个数控制的位,别的都不能为1(若在除了这v+1位上有1,则会导致这个数对于后v+1个数线性无关)。
.
而  不能往别的状态上转移了,但i后面的数就能任取了。其对答案的贡献为 .
考虑用矩阵乘法加速。
前面的那一大堆的系数都是常数。唯有向答案贡献的地方乘的是 。怎么办呢?考虑最后的答案是个关于m的多项式,每个系数就是 ,那么用秦九韶算法展开后,所有系数便都变为常数了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#define Rep(i, x, y) for (int i = x; i <= y; i ++)
#define Dwn(i, x, y) for (int i = x; i >= y; i --)
#define RepE(i, x) for(int i = pos[x]; i; i = g[i].nex)
using namespace std;
typedef long long LL;
const int N = 105, mod = 1000000007;
int u = 1, u1, n; LL A0, s2[N];
struct Matr {LL a[N][N];Matr() { memset(a, 0, sizeof(a)); }
} p, q;
Matr operator* (Matr x, Matr y) {Matr z;Rep(i, 1, n)Rep(k, 1, n)Rep(j, 1, n) (z.a[i][j] += x.a[i][k] * y.a[k][j]) %= mod;return z;
}
class YetAnotherNim {
public:void Pow(int x) {while (x) {if (x & 1) q = q * p;p = p * p, x >>= 1;}}int pow2(LL x, int y) {LL z = 1;while (y) {if (y & 1) (z *= x) %= mod;y >>= 1, (x *= x) %= mod;}return z;}int solve(int T, int m, int n0) {n = n0, A0 = pow2(m, T);while (u <= m) u *= 2, u1 ++;if (n == 1) return 0;if (n > u1) return A0;// puts("fin");s2[0] = 1;Rep(i, 1, n - 1) {s2[i] = s2[i - 1] * 2 % mod;Rep(j, 1, i) p.a[i][j] = s2[j - 1];p.a[i][i + 1] = (m + 1 - s2[i] + mod) % mod;} p.a[n][n] = m;q.a[1][1] = m;Pow(T - 1);
//      cout << A0 << endl;return int((A0 - q.a[1][n] + mod) % mod);}
};

【2012 Semifinal 1】 YetAnotherNim相关推荐

  1. 【2012.07.31】天语大黄蜂w806原生安卓v3118

    写在前面的话: 1. 本论坛发布的[蜂巢版]刷机包仅供论坛ROM测试组使用: 2. 刷机包分为[蜂巢体验版].[蜂巢测试版]两种版本,后者更新较快,但可能存在不稳定因素,请谨慎选择: 3. 刷机有风险 ...

  2. 【2012年终总结】之一 opencv + ds采集摄像头视频 MFC点点滴滴

    1.MFC单文档多文档程序 不让MFC来更新菜单 1 在CMainFrame::CMainFrame中添加 2 3 m_bAutoMenuEnable = FALSE; 标题栏图标的更改 1 //cu ...

  3. 【2012.4.22】北京植物园卧佛寺

    今天花了半天时间,12点多到5点多,骑行去"北京植物园",然后骑回.吃完午饭出发,回来正好吃晚饭.食堂解决. 感觉微累~就是车子有点咯·~ -----稍作修正----图说吧,还是- ...

  4. button 与 input type=button 的区别【2012/07/23】

    <button>标签定义按钮.其内部可以放置内容(文本或者图像),这也是它与input创建按钮的不同之处. <button> 控件 与 <input type=" ...

  5. 【TCO2013 Semifinal 2】 OneBlack

    Description 一个  的网格图,一些格子有障碍.一条合法路径的定义是从  到 的,一共走  步的路径. 你要把一些格子染黑,使得每一条合法路径上恰好有一个黑点.问合法方案数. Difficu ...

  6. 【2012校园招聘】天津天地伟业

    2011.09.20 天地伟业笔试 面向对象的三大特征  类的成员函数  重载  指向数组的指针  参数的传递方式  设置默认参数  联编  sizeof和strlen  结构和联合区别  unsig ...

  7. 【2012校园招聘】中兴

    2011.09.14中兴笔试 题型:单选 多选 判断 问答 编程 不能重载的操作符  线程  句柄  实参形参  优先级  sizeof结构体联合体  链表  heap stack  算法复杂度  各 ...

  8. 【超详细教程】使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结...

    [超详细教程]使用Windows Live Writer 2012和Office Word 2013 发布文章到博客园全面总结 原文 http://www.cnblogs.com/liuxianan/ ...

  9. 【2012年中山纪念中学信息学竞赛初一选拔赛一】美丽的纪中(a)

    [2012年中山纪念中学信息学竞赛初一选拔赛一]美丽的纪中(a) (File IO): input:a.in output:a.out 时间限制: 1000 ms 空间限制: 262144 KB [题 ...

最新文章

  1. 网页全终端视频流媒体视频直播/点播播放器EasyPlayer.js实现WEB播放H265/HEVC视频方案介绍
  2. 安全观之我见(三):省银之道在预防
  3. UOJ #395 BZOJ 5417 Luogu P4770 [NOI2018]你的名字 (后缀自动机、线段树合并)
  4. 数字证书格式详细说明【转】
  5. C++堆排序(附完整源码)
  6. 新加坡樟宜机场将进入“刷脸”时代 自助通关是亮点
  7. java ftp 中文上传_java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题...
  8. 中国.COM域名注册量达404万个 排名全球第三
  9. About Wisdom
  10. drop sqlite 多个表_android sqlite 一次创建多个表
  11. 表面肌电信号(sEMG)介绍
  12. libpng创建及编辑图片
  13. 408 计算机网络 知识点总结
  14. 收藏几个漂亮的管理后台模板
  15. 获取小游戏SWF文件中的素材
  16. 键盘win键和alt互换了怎么办
  17. spring 代码执行 (CVE-2018-1273)
  18. 【JAVA8】Map新方法,别再重复造车轮了
  19. html怎么给背景图固定位置,css实现固定背景图像的方法
  20. HTML 常用转义字符

热门文章

  1. 17届智能车-电磁组比赛心得一
  2. TX2跑通yolov4
  3. xml 以及JSON学习记录
  4. 15个热门Java面试项目整合,吃透它,大厂offer拿到手软
  5. scratch做飞猫躲避飞龙的游戏
  6. 2020年4月西安葡萄城挂经
  7. 云VR的未来发展方向
  8. icloud 照片同步_如何在线查看iCloud照片
  9. 操作系统学习笔记-虚拟内存
  10. Java面向对象基础呕心沥血三千字