题解-AtCoder-agc003F Fraction of Fractal(非矩阵快速幂解法)
Problem
题意:给出\(n\)行\(m\)列的01矩阵,一开始所有 \(1\) 连通,称此为\(1\)级分形,定义\(i\)级分形为\(i-1\)级分形中每个标示为 \(1\) 的格子中放一个 \(i-1\) 级分形(结合样例理解),求\(k\)级分形的连通块数量
Solution
网上好像都是矩阵快速幂的解法,然后一位集训中认识的dalao告诉我还有一种不用矩阵快速幂的解法:
首先发现分形中相接的地方一定是01矩阵某一行的左右端点或某一列的上下端点,我们管这些叫“接口”;在开始前先特判\(k=0\)或\(k=1\)
如果一个01矩阵既有上下接口又有左右接口,那么这个图形不管在几级分形下总会只有一个联通块;同样的,如果上下接口和左右接口都没有的话,那么这个图形不管在几级分形下不会相接,即设图形中 \(1\) 的数量为 \(S\),则 \(k\) 级分形的联通块个数为\(S^{k-1}\)(分形一次联通块个数乘\(S\))。现在剩下的情况中两种接口必定存在一个
设 \(c\) 为接口总数(一对算一个),\(S\)为01矩阵中 \(1\) 的数量,\(d\) 为块内连通个数(若仅有左右接口,则\(d\)为01矩阵中左右相邻两格都是 \(1\) 的对数;若仅有上下接口,则\(d\)为01矩阵中上下相邻两个都是 \(1\) 的对数)
设 \(f_i\) 表示 \(i\) 级分形到 \(i+1\) 级分形时,\(n\cdot m\)个 \(i\) 级分形之间连通的个数(因为之间多连通一对,那最终联通块个数减一)
则有
\ d, & i=1\\
\ f_{i-1}\cdot c, & i\geq 2
\end{cases}\]
由于在 \(i\) 级分形到第 \(i+1\) 级分形中合并的数量在 \(k\) 级分形中会被复制 \(S^{k-1-i}\) 次
所以答案为
\]
将 \(f_i=dc^{i-1}\) 代入,化简得
\]
\]
\]
\]
\]
这样就只需要快速幂而非矩阵快速幂了
Code
#include <cstdio>
typedef long long ll;
const int N=1010,p=1e9+7;
char s[N][N];
int n,m,d,c,S,col,row;
ll k;
inline int qm(int x){return x<0?x+p:x;}
template <typename _tp> inline int qpow(int A,_tp B){
int res(1);while(B){
if(B&1)res=1ll*res*A%p;
A=1ll*A*A%p,B>>=1;
}return res;
}
int main(){
scanf("%d%d%lld",&n,&m,&k);
for(int i=1;i<=n;++i){
scanf("%s",s[i]+1);
for(int j=1;j<=m;++j)
if(s[i][j]=='#')++S;
}
for(int i=1;i<=n;++i)if(s[i][1]=='#'&&'#'==s[i][m])++row;
for(int i=1;i<=m;++i)if(s[1][i]=='#'&&'#'==s[n][i])++col;
if(!row&&!col){printf("%d\n",qpow(S,k-1));return 0;}
if(!k||(row&&col)){puts("1");return 0;}
if(row)
for(int i=1;i<=n;++i)
for(int j=1;j<m;++j)
d+=(s[i][j]=='#'&&s[i][j+1]=='#');
else
for(int i=1;i<n;++i)
for(int j=1;j<=m;++j)
d+=(s[i][j]=='#'&&s[i+1][j]=='#');
c=row?row:col;
int ans=qm(qpow(S,k-1)-qpow(c,k-1));
ans=1ll*ans*d%p;
ans=1ll*ans*qpow(qm(S-c),p-2)%p;
printf("%d\n",qm(qpow(S,k-1)-ans));
return 0;
}
题解-AtCoder-agc003F Fraction of Fractal(非矩阵快速幂解法)的更多相关文章
- [AGC003F] Fraction of Fractal(矩阵乘法)
Description Snuke从他的母亲那里得到了生日礼物--一个网格.网格有H行W列.每个单元格都是黑色或白色.所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过黑色单元格即可从任 ...
- @atcoder - AGC003F@ Fraction of Fractal
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 H*W 黑白格图,保证黑格四连通. 定义分形如下:0 ...
- 题解——洛谷P3390 【模板】矩阵快速幂(矩阵乘法)
模板题 留个档 #include <cstdio> #include <algorithm> #include <cstring> #define int long ...
- HDU 5434 Peace small elephant 状压dp+矩阵快速幂
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant Accepts: 38 Submissions: ...
- 【BZOJ】1875: [SDOI2009]HH去散步 矩阵快速幂
[题意]给定n个点m边的无向图,求A到B恰好经过t条边的路径数,路径须满足每条边都和前一条边不同.n<=20,m<=60,t<=2^30. [算法]矩阵快速幂 [题解]将图的邻接矩阵 ...
- Atcoder Grand Contest 003 F - Fraction of Fractal(矩阵乘法)
Atcoder 题面传送门 & 洛谷题面传送门 Yet another AGC F,然鹅这次就没能自己想出来了-- 首先需注意到题目中有一个条件叫做"黑格子组成的连通块是四联通的&q ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化
这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...
- HDU 2157(矩阵快速幂)题解
How many ways?? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- Sublime Text3 里使用MarkDown如何预览
安装需要的包: 1.markdown editing 2.markdown preview 具体的步骤是: 1.按住ctrl + shift + p 来调出一个弹出的输入框 :2.输入package ...
- Linux 检查 外部设备 是否存在
以 USB 为例,如果移植了udev,那么在usb插入的时候,/dev下面会出现usb有关的设备,同时,自动挂载到文件系统的某个节点 如果以文件系统usb对应的挂载点来检测USB是否插入,是不够严谨的 ...
- 编写高质量Python代码总结:待完成
1:字符串格式化 #避免%过多影响阅读 print('hello %(name)s'%{'name':'tom'}) #format方法print('{name} is very {emmition} ...
- 2016vijos 6-1 松鼠聚会(LCA+卡空间)
求LCA,N=1e6,原空间限制8MB 求LCA需要深度,需要跳跃一定距离的祖先,需要父节点 把一个整数压成3个char,f[]存父节点 g[],深度为奇数的点存往上跳576步能到的点,深度为偶数的点 ...
- Spark源码剖析 - SparkContext的初始化(四)_Hadoop相关配置及Executor环境变量
4. Hadoop相关配置及Executor环境变量的设置 4.1 Hadoop相关配置信息 默认情况下,Spark使用HDFS作为分布式文件系统,所以需要获取Hadoop相关配置信息的代码如下: 获 ...
- node中glob模块
glob glob允许使用规则,从而获取对应规则匹配的文件 node的glob模块允许你使用 * 等符号,来写一个glob规则,像在shell里一样,获取匹配对应规则文件 安装 npm install ...
- Java入门系列
包装类 基本数据类型之间的相互转换不是都可以制动转换的,而你强制转换又会出问题,比如String类型的转换为int类型的,那么jdk为了方便用户就提供了相应的包装类. 基本类型对应的包装类 创建一个包 ...
- Sqlserver远程过程调用失败
这种情况一般是由于有高版本的SqlServer导致的,网上有删除Loaldb之类的建议,这样其实不太好,回头用高版本数据库的话还得装回来.其实可以通过计算机管理->服务和应用程序进行设置,用下面 ...
- CoreText实现图文混排
CoreText的介绍 Core Text 是基于 iOS 3.2+ 和 OSX 10.5+ 的一种能够对文本格式和文本布局进行精细控制的文本引擎.它良好的结合了 UIKit 和 Core Graph ...
- AD软件使用心得
1.在更新原理图之前一定要标记所有器件,否则无法生成PCB器件. 2.学会用sch list网表来批量修改器件名称 3.布线的面