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的更多相关文章

  1. [AGC003F] Fraction of Fractal 矩阵快速幂

    Description ​ SnukeSnuke从他的母亲那里得到了生日礼物--一个网格.网格有HH行WW列.每个单元格都是黑色或白色.所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过 ...

  2. [AGC003F] Fraction of Fractal(矩阵乘法)

    Description Snuke从他的母亲那里得到了生日礼物--一个网格.网格有H行W列.每个单元格都是黑色或白色.所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过黑色单元格即可从任 ...

  3. @atcoder - AGC003F@ Fraction of Fractal

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个 H*W 黑白格图,保证黑格四连通. 定义分形如下:0 ...

  4. 【AGC003F】Fraction of Fractal

    Description ​ 原题链接 ​ Solution ​ 神题. ​ 定义一个上边界或下边界的格子为"上下接口",当且仅当上下边界该位置的格子都是黑色的. ​ "左 ...

  5. 题解-AtCoder-agc003F Fraction of Fractal(非矩阵快速幂解法)

    Problem AtCoder-agc003F 题意:给出\(n\)行\(m\)列的01矩阵,一开始所有 \(1\) 连通,称此为\(1\)级分形,定义\(i\)级分形为\(i-1\)级分形中每个标示 ...

  6. AtCoder Grand Contest 003 F - Fraction of Fractal

    题目传送门:https://agc003.contest.atcoder.jp/tasks/agc003_f 题目大意: 给定一个\(H×W\)的黑白网格,保证黑格四连通且至少有一个黑格 定义分形如下 ...

  7. Atcoder Grand Contest 003 F - Fraction of Fractal(矩阵乘法)

    Atcoder 题面传送门 & 洛谷题面传送门 Yet another AGC F,然鹅这次就没能自己想出来了-- 首先需注意到题目中有一个条件叫做"黑格子组成的连通块是四联通的&q ...

  8. AtCoder Grand Contest 003

    AtCoder Grand Contest 003 A - Wanna go back home 翻译 告诉你一个人每天向哪个方向走,你可以自定义他每天走的距离,问它能否在最后一天结束之后回到起点. ...

  9. RE:从零开始的AGC被虐(到)生活(不能自理)

    RE:从零开始的AGC被虐(到)生活(不能自理) 「一直注视着你,似近似远,总是触碰不到.」 --来自风平浪静的明天 AtCoder Grand Contest 001 B: Mysterious L ...

随机推荐

  1. ipconfig命令一览

    前文用到了ipconfig /displaydns和ipconfig /flushdns,加上之前经常ipconfig查ip,今天看了一下别的命令,用的不多,仅作备忘~~ 命令行窗口中输入ipconf ...

  2. 【jQuery】结合accordion插件分析写插件的方法及注意事项

    1.jQuery插件的命名方式:jquery.[插件名].js 2.对象方法附加在jQuery.fn上,全局函数附加在jQuery对象本身上 3.插件内部this指向的是通过选择器获取的jQuery对 ...

  3. [Python 网络编程] makefile (三)

    socket.makefile(mode ='r',buffering = None,*,encoding = None,errors = None,newline = None )返回一个与套接字相 ...

  4. face++

    1.链表反转 2.快排 3.m*k   n*k两矩阵计算欧几里得距离np.tile 4.链表排序,要求时间复杂度小于O(N^2),空间O(1),不允许改变链表的值 5.2sum及其变体 6.给一个数组 ...

  5. Eclipse常用快捷键(持续更新)

    编辑相关快捷键 Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率.Eclipse中有如下一些和编辑相关的快捷键. 1.[Ctrl+O] 显示类中方法和属性的大纲, ...

  6. 【luogu P1373 小a和uim之大逃离】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1373 想不出来状态 看了一眼题解状态明白了 dp[i][j][h][1/0] 表示在i,j点差值为h是小A还 ...

  7. HTML+JS实现视频上传显示进度条

    示例代码: css部分: #content{border: 1px solid saddlebrown;padding: 16px;border-radius: 2px} .list {top: 15 ...

  8. redis集群环境搭建的错误

    安装redis集群需要版本号在3.0以上 redis-cluster安装前需要安装ruby环境 搭建集群需要使用到官方提供的ruby脚本. 需要安装ruby的环境. yum -y install ru ...

  9. 客户端对象模型之Excel数据导入到列表

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  10. 【CSS3基础-Flex布局】

    关于Flex 背景 在flex布局出现以前,常用的水平和垂直居中对齐方式有很多.flex布局的出现基本规范了这一过程. 通过justify-content和align-items两个属性即解决了水平居 ...