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. struts配置中的常量定义

    一.常量可以在struts.xml或struts.properties中配置,建议在struts.xml中配置,两种配置方式如下: (1)在struts.xml文件中配置常量 <struts&g ...

  2. 在 Deepin 中搭建 GitLab

    入职半个月了,一直在接受业务知识以及企业文化知识的培训,下周终于要开始上岗入手项目了.由于公司使用自己搭建的 GitLab 服务作为项目版本控制器,所以我决定学习一下 GitLab,由于这货跟 Git ...

  3. JavaScript浏览器检测之客户端检测

    客户端检测一共分为三种,分别为:能力检测.怪癖检测和用户代理检测,通过这三种检测方案,我们可以充分的了解当前浏览器所处系统.所支持的语法.所具有的特殊性能. 一.能力检测: 能力检测又称作为特性检测, ...

  4. 【2】【MOOC】Python游戏开发入门-北京理工大学【第三部分-游戏开发之机制(屏幕绘制机制)】

    学习地址链接:http://www.icourse163.org/course/0809BIT021E-1001873001?utm_campaign=share&utm_medium=and ...

  5. Codeforces441A_Valera and Antique Items(水题)

    Valera and Antique Items time limit per test 1 second memory limit per test 256 megabytes input stan ...

  6. Java并发案例04---Future和 FutureTask

    4.Future和 FutureTask 4.1 Future是Callable的返回结果. 它有三个功能 1.判断任务是否完成 2.能够中断任务 3.能够获取任务返回结果 4.2 FutureTas ...

  7. BZOJ2599:[IOI2011]Race(点分治)

    Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...

  8. 【[SDOI2014]数数】

    被慎老师教育数位\(dp\)怎么写了 看来我数位\(dp\)的写法太落后了 这道题很显然就是一个\(AC\)自动机上的数位\(dp\),按照套路 我们可以设计\(dp[i][j][0/1]\)表示匹配 ...

  9. 【[NOI2018]屠龙勇士】

    发现好像都是化掉系数之后套上\(ExCrt\)的板子 这好像是一个真正的扩展扩展中国剩余定理 我们要处理的方程是这样的形式 \[c_ix\equiv b_i(mod\ a_i)\] 其中\(c\)用一 ...

  10. 【ES6】最常用的es6特性(一)

    参考链接: http://www.jianshu.com/p/ebfeb687eb70 http://www.cnblogs.com/Wayou/p/es6_new_features.html 1.l ...