[AGC003F] Fraction of Fractal 矩阵快速幂
Description
SnukeSnuke从他的母亲那里得到了生日礼物——一个网格。网格有HH行WW列。每个单元格都是黑色或白色。所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过黑色单元格即可从任何黑色单元格移动到任何其他黑色单元格。
第ii行第jj列的单元格的颜色由字符si,jsi,j表示。如果si,jsi,j是 #,该单元格为黑色;如果si,jsi,j是 .,该单元格为白色。至少一个单元格是黑色的。
我们定义「分形」如下:00级分形是一个 1×11×1的黑色单元格.kk级分形由HH行WW列较小一级的分形按照 SnukeSnuke 的网格的样式拼成:与SnukeSnuke 网格中的黑色单元格对应的位置是一个kk级分形;与SnukeSnuke 网格中的白色单元格对应的位置是一个单元格全部为白色,尺寸与kk级分形相同的网格。
您将得到 SnukeSnuke 的网格的描述和整数 KK。请求出KK级分形中黑色单元格组成的连通分量数,模109+7109+7。
Input
第一行三个整数H,W,K如题目描述
接下来H行,每行W个字符
Output
输出KK级分形中黑色单元格组成的连通分量数,模109+7109+7。
Sample Input
3 3 3
.#.
###
#.#
Sample Output
20
HINT
本题采用subtask。
真的抱歉部分分一拖再拖……
- 存在5%5%的数据满足黑色方块与边界不相连。
- 存在10%10%的数据满足KK级分形的边长≤2000≤2000。
- 存在50%50%的数据满足黑色方块与四边界相连。
对于所有数据:
- 1≤H,W≤10001≤H,W≤1000
- 0≤K≤10180≤K≤1018
- 每个 si,jsi,j是 # 或 .
- 网格中所有黑色单元格四联通
- 网格中至少有一个黑色单元格
.............#.............
............###............
............#.#............
..........#..#..#..........
.........#########.........
.........#.##.##.#.........
..........#.....#..........
.........###...###.........
.........#.#...#.#.........
....#........#........#....
...###......###......###...
...#.#......#.#......#.#...
.#..#..#..#..#..#..#..#..#.
###########################
#.##.##.##.##.##.##.##.##.#
.#.....#..#.....#..#.....#.
###...######...######...###
#.#...#.##.#...#.##.#...#.#
....#.................#....
...###...............###...
...#.#...............#.#...
.#..#..#...........#..#..#.
#########.........#########
#.##.##.#.........#.##.##.#
.#.....#...........#.....#.
###...###.........###...###
#.#...#.#.........#.#...#.#
这个是第一个样例的样例解释
第二个样例:
3 3 3
###
#.#
###
OUTPUT:1
第三个样例:
11 15 1000000000000000000
.....#.........
....###........
....####.......
...######......
...#######.....
..##.###.##....
..##########...
.###.....####..
.####...######.
###############
#.##..##..##..#
OUTPUT:301811921
Sol
其实这题不是很难想,但是看起来太神了觉得不是很可做所以当时就索性放弃了QWQ
Code
#include <bits/stdc++.h>
using namespace std;
#define P 1000000007
int n,m,x,y,z;char s[1005][1005],t[1005][1005];long long k;
struct M
{
long long m[5][5];
M(){memset(m,0,sizeof(m));}
M operator*(const M &b)const
{M c;for(int i=1,j,k;i<=2;i++) for(j=1;j<=2;j++) for(k=1;k<=2;k++) (c.m[i][j]+=m[i][k]*b.m[k][j])%=P;return c;}
M operator^(long long x)const
{M a(*this),ans;for(int i=1;i<=2;i++)ans.m[i][i]=1;for(;x;x>>=1,a=a*a) if(x&1)ans=ans*a;return ans;}
}ans;
int ksm(int x,long long y){int ans=1;for(;y;y>>=1,x=1ll*x*x%P) if(y&1) ans=1ll*ans*x%P;return ans;}
bool chk(){for(int i=1;i<=n;i++) if(s[i][1]=='#'&&s[i][m]=='#') return 1;return 0;}
void turn90(){for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) t[m-j+1][i]=s[i][j];swap(n,m);memcpy(s,t,sizeof(s));}
int main()
{
scanf("%d%d%lld",&n,&m,&k);
for(int i=1,j;i<=n;i++) for(scanf("%s",s[i]+1),j=1;j<=m;j++) x+=s[i][j]=='#';
bool a=chk(),b=(turn90(),chk());turn90();
if(a&&b) return printf("1"),0;
else if(!a&&!b) return printf("%d",ksm(x,k-1)),0;
else if(b) turn90();
for(int i=1;i<=n;i++) z+=s[i][1]=='#'&&s[i][m]=='#';
for(int i=1;i<=n;i++) for(int j=1;j<m;j++) y+=s[i][j]=='#'&&s[i][j+1]=='#';
ans.m[1][1]=x,ans.m[1][2]=y,ans.m[2][2]=z;ans=ans^(k-1);
printf("%lld",(ans.m[1][1]-ans.m[1][2]+P)%P);
}
[AGC003F] Fraction of Fractal 矩阵快速幂的更多相关文章
- 题解-AtCoder-agc003F Fraction of Fractal(非矩阵快速幂解法)
Problem AtCoder-agc003F 题意:给出\(n\)行\(m\)列的01矩阵,一开始所有 \(1\) 连通,称此为\(1\)级分形,定义\(i\)级分形为\(i-1\)级分形中每个标示 ...
- [AGC003F] Fraction of Fractal(矩阵乘法)
Description Snuke从他的母亲那里得到了生日礼物--一个网格.网格有H行W列.每个单元格都是黑色或白色.所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过黑色单元格即可从任 ...
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- 51nod 1113 矩阵快速幂
题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- HDU5950(矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...
- 51nod 1126 矩阵快速幂 水
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
随机推荐
- onload函数和自执行函数的区别(jquery API网址:http://jquery.cuishifeng.cn/)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- go cobra
https://github.com/spf13/cobra https://github.com/spf13/cobra/blob/master/bash_completions.md go get ...
- noi2729 Blah数集
Blah数集 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah,对于以a为基的集合Ba定义如下: (1) a是集合Ba的基,且a是Ba的第一个元素: (2)如果x在集合Ba中,则2x+1和3x ...
- Python爬虫实战三之实现山东大学无线网络掉线自动重连
综述 最近山大软件园校区QLSC_STU无线网掉线掉的厉害,连上之后平均十分钟左右掉线一次,很是让人心烦,还能不能愉快地上自习了?能忍吗?反正我是不能忍了,嗯,自己动手,丰衣足食!写个程序解决掉它! ...
- hdu 2049 不容易系列之(4)——考新郎 (错排递推)
当n个编号元素放在n个编号位置,元素编号与位置编号各不对应的方法数用M(n)表示,那么M(n-1)就表示n-1个编号元素放在n-1个编号位置,各不对应的方法数,其它类推. 第一步,把第n个元素放在一个 ...
- response乱码和request乱码
response乱码 一.浏览器乱码 原因是:浏览器显示编码和文件的数据编码不一致 浏览器显示编码 response.setCharacterEncoding("utf-8"); ...
- JS中立即执行函数的理解
1.匿名函数不能单独定义,必须进行赋值操作或者立即执行,否则会被JS引擎定义为语法错误 function(){alert(dada);} VM229:1 Uncaught SyntaxError: U ...
- 数据库SQL优化大总结之 百万级数据库优化方案(转)
出处:http://www.cnblogs.com/yunfeifei/p/3850440.htm 网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不 ...
- CentOS 7搭建FTP服务器
安装vsftpd 命令:yum -y install vsftpd 修改ftp配置文件 命令:vim /etc/vsftpd/vsftpd.conf 按i进入insert模式后,按以下要求修改 ano ...
- JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(11):XML和Annotation装配Bean的混合使用(@ImportResource)
一.XML和Annotation装配Bean如何合理使用 引入第三方资源包中类的时候,建议使用XML配置,而使用自己编写的Java类的时候,推荐使用Annotation注解配置Bean. 二.关于注解 ...