SGU 197.Nice Patterns Strike Back
时间限制:0.5s
空间限制:6M
题意:
给出长n(n<=10^100)和宽m(m<=5)的地面,铺上黑色和白色的地板,使得没有任意一个2*2大小的地面铺同种颜色的方案数是多少.
Solution:
状态压缩,一个数字的对应为01分别代表铺白色和黑色地板,对于每一列有(1<<m)种状态.
我们可以构造一个矩阵,mat[i][j]代表,第一列是状态是i,第二列是j的方案数,显然mat[i][j]不是0就是1,而且很容易判断构造.
然后我们只要对这个矩阵进行快速幂运算,幂为(n-1),当然不要忘记取模,最后把mat所有元素加起来就是我们想要的答案了.
由于n比较大,所以要做大数的减一,和除以二的运算.
code
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
struct Mat {
int mat[][];
} mx;
int pow[];
int n, m, mod, len;
Mat operator * (Mat a, Mat b) {
Mat c;
memset (c.mat, , sizeof c.mat);
for (int k = ; k < ( << m); k++)
for (int i = ; i < ( << m); i++)
for (int j = ; j < ( << m); j++)
(c.mat[i][j] += (a.mat[i][k] * b.mat[k][j]) % mod) %= mod;
return c; }
inline int div2() {
int ans[] = {};
int i, res = ;
for(i = ; i < len; ++i) {
ans[i] = (pow[i]+res*)/;
res = (pow[i]+res*)%;
}
if(ans[] == ) len--;
for(i = +(ans[] == ); i < len+(ans[] == ); i++)
pow[i-(ans[] == )] = ans[i];
return res;
}
Mat operator ^ (Mat a, int pow[]) {
Mat c;
for (int i = ; i < ( << m); i++)
for (int j = ; j < ( << m); j++)
c.mat[i][j] = (i == j);
while (len) {
if (div2() )
c = c * a;
a = a * a;
}
return c;
}
string s;
int main() {
ios::sync_with_stdio ();
while(cin >> s >> m >> mod){
for (int i = ; i < s.size(); ++i)
pow[i] = s[i] - '';
len = s.size();
for (int i = len - ; i >= ; i--) {
if (pow[i]) {
--pow[i];
break;
}
else
pow[i] = ;
}
if (pow[] == ) {
for (int i = ; i < len - ; i++) pow[i] = ;
pow[--len]=;
}
for (int i = ; i < ( << m); i++)
for (int j = ; j < ( << m); j++) {
mx.mat[i][j] = ;
for (int k = , tem = i ^ j; k < m - ; k++)
if ( (tem & << k) == && (tem & << k + ) ==
&&( ( (i & << k) > && (i & << k + ) > ) || ( ( (i & << k) == && (i & << k + ) == ) ) ) ) {
mx.mat[i][j] = ;
break;
}
}
mx = mx ^ pow;
int ans = ;
for (int i = ; i < ( << m); i++)
for (int j = ; j < ( << m); j++) {
ans += mx.mat[i][j];
while (ans >= mod) ans -= mod;
}
cout << ans << endl;
}
}
SGU 197.Nice Patterns Strike Back的更多相关文章
- ZOJ2317-Nice Patterns Strike Back:矩阵快速幂,高精度
Nice Patterns Strike Back Time Limit: 20000/10000MS (Java/Others)Memory Limit: 128000/64000KB (Java/ ...
- zoj 2317 Nice Patterns Strike Back(矩阵乘法)
problemId=1317">http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=1317 给出一个n*m的矩阵( ...
- SGU 分类
http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...
- ASC #1
开始套题训练,第一套ASC题目,记住不放过每一题,多独立思考. Problem A ZOJ 2313 Chinese Girls' Amusement 循环节 题意:给定n,为圆环长度,求k < ...
- sentence patterns
第四部分 推理题 1.世界上每个角落的每个人都有立场,都有背景,都有推理性,能推理出一个人语言的真意,才成就了真正的推理能力: 2.换言之,如果你能通过一个人的说话推理出其身份职业,你的推理能 ...
- sgu Theodore Roosevelt【判断点是否在凸多边形内模板】
链接: http://acm.sgu.ru/problem.php?contest=0&problem=253 http://acm.hust.edu.cn/vjudge/contest/vi ...
- Design Patterns Simplified - Part 3 (Simple Factory)【设计模式简述--第三部分(简单工厂)】
原文链接:http://www.c-sharpcorner.com/UploadFile/19b1bd/design-patterns-simplified-part3-factory/ Design ...
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 [后缀数组]
1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1017 Solved: ...
- [LeetCode] Android Unlock Patterns 安卓解锁模式
Given an Android 3x3 key lock screen and two integers m and n, where 1 ≤ m ≤ n ≤ 9, count the total ...
随机推荐
- 【转】iOS开发Xcode7真机调试教程
原文网址:https://www.skyfox.org/ios-xcode7-debug-device.html 从Xcode7开始,Xcode 不需要$99/$299升级开发者直接可以进行真机调试 ...
- 关于将客户端移植到Lua的解决方案设想。
现在发行商都需要cp们做热更新,而对于unity制作的游戏来讲,这个恐怕是个噩梦,而项目已经进行到中后期,确实很麻烦,有UniLua,但是如果全部手动解决恐怕上不了线了工作量太大,初步设想如果做一个基 ...
- swfupload 在ie9以上浏览器报错问题记录
解决办法: swfuploadl.js line 840左右 SWFUpload.prototype.cleanUp if (typeof(movieElement[key]) === "f ...
- Google视频搜索
本博文的主要内容有 .Google视频搜索的介绍 .Google视频搜索之一:普通搜索 .Google视频搜索之二:高级搜索 1.Google视频搜索的介绍 https://zh.wiki ...
- 【机房系统知识小结】微软自带RDLC报表,数据汇总设计
在做机房系统报表的时候,借鉴 八期崔成龙学长的博客< VB.NET rdlc 报表的使用>,照虎画猫的敲了一遍,但是在“汇总项”中,出现了一点小问题. 具体的设计方法在这里就不做介绍了,请 ...
- POJ 3094 Quicksum(简单的问题)
[简要题意]:题意是非常easy. 看样能理解 [分析]:略. 读取字符串. // 200K 0Ms #include<iostream> using namespace std; int ...
- android 02 登录
activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...
- 关于怎么将Quartus和Nios程序一起固化到FPGA里面
系统:win8.1 SDK:Quartus II 14.1 FPGA:Cyclone IV 1.将Quartus生成的.pof文件(配置Flash即可自动生成,这里不讨论),与Nios生成的.elf文 ...
- PRD产品需求文档概要
PRD概念 PRM就是Product Requirements Document的简称,也就是产品需求模型.一般来说一个产品会伴随有市场需求文档(Market Requirements Documen ...
- oracle数组定义与使用
定义固定长度的一维数组 type type_array is varray(10) of varchar2(20); 1.varray(10)表示定义长度为10的数组 2.varchar2(20)表示 ...