[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 ...
随机推荐
- 面向对象的JavaScript --- 多态
面向对象的JavaScript --- 多态 多态 "多态"一词源于希腊文 polymorphism,拆开来看是poly(复数)+ morph(形态)+ism,从字面上我们可以理解 ...
- webview综述
nWebView 是webkit最核心的一个view,WebView管理WebFrameView和WebFrame之间的交互,一个WebView对象绑定一个window,并且要求MainFrame加载 ...
- mysql5.6 函数大全
# 数学函数(1)ABS(x)返回x的绝对值(2)PI()返回圆周率π,默认显示6位小数(3)SQRT(x)返回非负数的x的二次方根(4)MOD(x,y)返回x被y除后的余数(5)CEIL(x).CE ...
- 马克飞象markdown用法
目录 markdown用法 ### 根据标题生成目录 `` 快捷键 ctrl+k 代码区域 ctrl+2 二级标题 ctrl+b/i 粗体/斜体 ctrl+l 插入链接 ctrl+g 插入图片 ctr ...
- EF和linq to sql 关系
LINQ to SQL 允许你用任何类来代表数据库中的数据.表.同样的,EF也允许你用任何类来代表苏据库中的数据.表. 所不同的的地方是Linq to sql 用这些被修饰过的类直接同数据库打交道,存 ...
- mysql存储过程学习(一)
转载 什么是存储过程,存储过程的作用及优点 mysql存储过程详细教程 mysql 使用存储过程批量插数据 一.存储过程介绍: 存储过程(Stored Procedure)是一组为了完成特定功能的 ...
- 【luogu P3953 逛公园】 题解
题目链接:https://www.luogu.org/problemnew/show/P3953 题外话:感觉2017年神题好多..这还不是最神的一道,真在考场上我也就写个最短路计数暴力了.现在在大佬 ...
- Java clone() 浅克隆与深度克隆
内容转自:http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html 现在Clone已经不是一个新鲜词语了,伴随着“多莉”的产生 ...
- Vue指令 常见的几个内置指令
1.v-if指令:判断指令,根据表达式值得真假来插入或删除相应的值. 2.v-show指令:条件渲染指令,无论返回的布尔值是true还是false,元素都会存在在html中,只是false的元素会隐藏 ...
- java spring-WebSocket json参数传递与接收
Websocket原理(摘抄) 一.websocket与http WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环 ...