[agc003F]Fraction of Fractal
Description
Solution
本篇博客思路来自大佬的博客(侵删)。
我们定义如果网格的第一行和最后一行的第i列都为黑色,则它是一个上下界接口。左右界接口定义同上。
如果上下界接口和左右界接口都为0个,则答案为节点数^(k-1)。或者上下界接口和左右界接口都存在,则答案为1(就只有一个联通块了啊)。
将以上两种情况特判后,我们目前的网格要么只有上下界接口,要么只有左右界接口。我们只探讨前者。
对于k=2的分形(如果k<2特判就好),我们将1级分形看作一个节点(以下的点都是指1级分形,边同理),如果它与其他节点连通则视为将两个节点之间加一条边。
因为我们的网格只有上下界接口,所以2级分形事实上是由若干条链构成。以此类推,k级分形也是如此。
将链看成树,我们就可以运用森林的性质:树的个数等于总点数减去总边数。(这个性质是真的牛啊我自己完全想不到),即最后联通块的个数为总点数减去总边数。
考虑求总边数:
记原图中节点总数为all。
定义若a[i][j]与a[i+1][j]都为黑点则这是一个上下接口,(注意不是上下界接口),记其个数为usb。
记上下界接口个数为u。
设Ek为k级分形的边数。
边界E2=usb 递推式为 Ek=Ek-1*all+usb*uk-1
至于总点数(这里的点还是指1级分形)。。快速幂就好了。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int mod=1e9+;
typedef long long ll;
char ch[];
int a[][],h,w,up_down,left_right,cnt,usb;//cnt:黑点总数,usb:原图内总接口数
long long _pow;
ll ksm(ll x,long long k)
{
ll ans=;
while (k)
{
if (k&)ans=ans*x%mod;
k>>=;
x=x*x%mod;
}
return ans;
}
struct Matrix
{
ll t[][];
friend Matrix operator *(Matrix x,Matrix y)
{
Matrix z;
memset(z.t,,sizeof(z.t));
for (int i=;i<;i++)
for (int j=;j<;j++)
for (int k=;k<;k++)
z.t[i][j]=(z.t[i][j]+x.t[i][k]*y.t[k][j])%mod;
return z;
}
friend Matrix operator ^(Matrix x,long long k)
{
Matrix ans;
memset(ans.t,,sizeof(ans.t));
ans.t[][]=ans.t[][]=;
while (k)
{
if (k&) ans=ans*x;
k>>=;
x=x*x;
}
return ans;
}
}A,B;
int main()
{
scanf("%d%d%lld",&h,&w,&_pow);
if (_pow<=) {printf("");return ;}
for (int i=;i<=h;i++)
{
scanf("%s",ch+);
for (int j=;j<=w;j++)
{
a[i][j]=(ch[j]=='#');
if (a[i][j]) cnt++;
}
}
for (int i=;i<=w;i++)
if (a[][i]&&a[h][i]) up_down++;
for (int i=;i<=h;i++)
if (a[i][]&&a[i][w]) left_right++;
if (!up_down&&!left_right)
{
printf("%lld",ksm(cnt,_pow-));return ;
}
if (up_down&&left_right)
{
printf("");return ;
}
for (int i=;i<=h;i++)
for (int j=;j<=w;j++)
{
if (a[i][j]&&a[i][j+]&&left_right) usb++;
if (a[i][j]&&a[i+][j]&&up_down) usb++;
}
A.t[][]=cnt;A.t[][]=usb;A.t[][]=max(up_down,left_right);
A=A^(_pow-);
ll ans;ans=A.t[][]*usb%mod+A.t[][]*max(up_down,left_right)%mod;
ans%=mod;
printf("%lld",(ksm(cnt,_pow-)-ans+mod)%mod);
}
[agc003F]Fraction of Fractal的更多相关文章
- [AGC003F] Fraction of Fractal 矩阵快速幂
Description SnukeSnuke从他的母亲那里得到了生日礼物--一个网格.网格有HH行WW列.每个单元格都是黑色或白色.所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过 ...
- [AGC003F] Fraction of Fractal(矩阵乘法)
Description Snuke从他的母亲那里得到了生日礼物--一个网格.网格有H行W列.每个单元格都是黑色或白色.所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过黑色单元格即可从任 ...
- @atcoder - AGC003F@ Fraction of Fractal
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 H*W 黑白格图,保证黑格四连通. 定义分形如下:0 ...
- 【AGC003F】Fraction of Fractal
Description 原题链接 Solution 神题. 定义一个上边界或下边界的格子为"上下接口",当且仅当上下边界该位置的格子都是黑色的. "左 ...
- 题解-AtCoder-agc003F Fraction of Fractal(非矩阵快速幂解法)
Problem AtCoder-agc003F 题意:给出\(n\)行\(m\)列的01矩阵,一开始所有 \(1\) 连通,称此为\(1\)级分形,定义\(i\)级分形为\(i-1\)级分形中每个标示 ...
- AtCoder Grand Contest 003 F - Fraction of Fractal
题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...
- Atcoder Grand Contest 003 F - Fraction of Fractal(矩阵乘法)
Atcoder 题面传送门 & 洛谷题面传送门 Yet another AGC F,然鹅这次就没能自己想出来了-- 首先需注意到题目中有一个条件叫做"黑格子组成的连通块是四联通的&q ...
- AtCoder Grand Contest 003
AtCoder Grand Contest 003 A - Wanna go back home 翻译 告诉你一个人每天向哪个方向走,你可以自定义他每天走的距离,问它能否在最后一天结束之后回到起点. ...
- RE:从零开始的AGC被虐(到)生活(不能自理)
RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...
随机推荐
- vue项目出现的错误汇总
报错一: expected "indent", got "!" 通过vue-cli创建的项目,不需要在webpack.base.conf.js中再手动配置关于c ...
- 浏览器相关--H5本地存储
因为项目需要,最近研究了一下HTML5本地存储相关的东西,在这简单的记录一下. 浏览器存储主要包括一下几个部分1. cookie2. localStorage3. sessionStorage4. i ...
- 【[HNOI2008]GT考试】
我又来复习\(kmp\)了 其实这道题主要是一个矩阵乘法,但是\(kmp\)在其中也有着非常重要的作用 我们可以这样定义状态\(dp[i][j]\)表示文本串进行到了\(i\)位置,同时文本串在最后和 ...
- SVN篇
启动SVN : svnserve -d -r svn 查看进程: ps -ef | grep svmserve -------------------------------------------- ...
- Loj_6282. 数列分块入门 6
Loj_6282 这个题目涉及到了块的重构,这里使用了\(\sqrt{n}\)次插入便重构的方法 讲重复的操作提出来做了函数 #include <iostream> #include &l ...
- Android-社会化分享
2016年2月25日下午3点:现在无事,整理下这两天在网上搜集到的乱起八糟的东西和我的思路. 关于对社会化分享的了解,源于前天的一次apk打包操作.现在的情况是:开发编写功能代码提交SVN,我把代码d ...
- Python 有用的 map() deduce() filter() 函数
#!/usr/bin/python#5!+4!+3!+2!+1! #give 3 return 3*2*1def jiechen(n): N = map(lambda x:x+1,range(n)) ...
- 404 Note Found队-Alpha3
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:丹丹 组员7:家伟 组员8:政演 组员9:鸿杰 组员10:刘一好 组员11:何宇恒 展示组内最 ...
- 编译nginx错误:make[1]: *** [/pcre//Makefile] Error 127
--with-pcre=DIR 是设置源码目录,而不是编译安装后的目录.
- xcode10不兼容问题解决方法,framework编译脚本
XCode10报错:Build/Intermediates.noindex/XCBuildData/build.db": disk I/O error 更改-scheme 为-target ...