题解-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) ...
随机推荐
- Dubbo服务启动脚本
## /usr/wangfajun/service/user #!/bin/sh ## java env export JAVA_HOME=/usr/java/jdk1..0_79 export JR ...
- Android上禁止屏幕旋转
看网上讲了很多,设置很多属性,设置了很多,其实最关键的一点是这个 @Overrideprotected void onResume() { /** * 设置为横屏 */ if(getRequested ...
- nativefier - 快速把任意网页生成桌面应用程序
使用前端技术开发桌面应用的技术已经相当成熟了,像早先的 NW.js,如今很火的 Electron 等,都可以轻松实现.今天给大家分享的 nativefier 就是基于 Electron 封装的,可以帮 ...
- (5)top k大的数目
一.问题 在一个很长的数组中,求出top k大小的数目 二.办法 用优先队列 时间复杂度O(nlog(k)),应该是最差的情况下是这个 三.Code package algorithm; import ...
- class按传递时分析
class FEF{ public: int a; FEF(int a,int b){ this->a = a*b; } }; void mam(FEF a){ printf("%d ...
- webpack设置热更新
首先需要在package.json中配置一个脚本参数 --hot "dev": "webpack-dev-server --mode development --hot& ...
- python发送网络请求
1.使用urllib模块(使用不方便,建议使用第二种) get请求: res = urlopen(url) from urllib.request import urlopen url = 'http ...
- 5.22 css和基本选择器
1,css的三种引入方式 1,行内样式 2,内接样式 3,外接样式:链接式和导入式. HTML的缺陷: 不能够适应多种设备 要求浏览器必须智能化足够庞大 数据和显示没有分开 功能不够强大 CSS 优点 ...
- Miller-Rabin判质数和Pollared-Rho因数分解
朴素判质数:$ 在[2..\sqrt{n}]$范围内枚举逐一判断是不是$ n$的因数 时间复杂度:$ O(\sqrt{n})$ 当n达到$ 10^{18}$级别时,显然效率过低 Miller-Rabi ...
- 剑指Offer-表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...