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. 使用tidylib解决不规则网页问题

    windows 下安装tidylib 先去https://pypi.python.org/pypi/pytidylib 下载pytidylib 跑官方提供的测试用例报错 ition 0: unexpe ...

  2. linux 根据端口号查看占用进程的pid

    1.netstat -nap | grep 端口号 2.第一种的可以查看端口号对应的pid,但是会出现pid为空的情况,这种时候用:lsof -i:端口号 3.根据pid查看端口号 netstat - ...

  3. BZOJ1486:[HNOI2009]最小圈(最短路,二分)

    Description Input Output Sample Input 4 5 1 2 5 2 3 5 3 1 5 2 4 3 4 1 3 Sample Output 3.66666667 Sol ...

  4. webpack4配置

    一.安装webpack 需要先在项目中npm init初始化一下,生成package.json 建议node版本安装到8.2以上 // webpack4中除了正常安装webpack之外,需要再单独安一 ...

  5. LeetCode刷题(数据库)---- 交换工资

    题:给定一个工资表,如下所示,m=男性 和 f=女性 .交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然).要求使用一个更新查询,并且没有中间临时表. 例如: | id | nam ...

  6. Dynamic Rankings—带单点修改的主席树

    这道题应该是很不错的板子了\(\mathcal{\color{cyan}{Link}}\) \(\mathcal{\color{red}{Description}}\) 给定一个序列,有两种操作.一是 ...

  7. 字符型设备驱动程序-first-printf以及点亮LED灯(四)

    怎么样 把 写的 代码 和 编译 放到  开发板上 去执行? 2017年5月22日16:34:13 需要 自己 编译 Linux 内核.. 需要 以下 几个 条件: 1.正常运行 Linux 的 开发 ...

  8. 使用JedisCluster出现异常:java.lang.NumberFormatException

    在使用JedisCluster进行测试时出现如下异常: java.lang.NumberFormatException: For input string: "7004@17004" ...

  9. 部分用户间接性访问不了linux服务器解决方法

    linux的/etc/sysctl.conf中应设置 net.ipv4.tcp_tw_reuse = net.ipv4.tcp_tw_recycle = 参考文章: https://ieevee.co ...

  10. Apache 各启动方式的差别

    apachectl 调用 $httpd -k 1. kill - TERM `cat /usr/local/apache/logs/http.pid` 2. /bin/httpd -k  stop/s ...