zoukankan      html  css  js  c++  java
  • [AGC003F] Fraction of Fractal 矩阵快速幂

    Description

    ​ SnukeSnuke从他的母亲那里得到了生日礼物——一个网格。网格有HH行WW列。每个单元格都是黑色或白色。所有黑色单元格都是四联通的,也就是说,只做水平或垂直移动且只经过黑色单元格即可从任何黑色单元格移动到任何其他黑色单元格。
    第ii行第jj列的单元格的颜色由字符si,jsi,j表示。如果si,jsi,j是 #,该单元格为黑色;如果si,jsi,j是 .,该单元格为白色。至少一个单元格是黑色的。
    我们定义「分形」如下:00级分形是一个 1×11×1的黑色单元格.kk级分形由HH行WW列较小一级的分形按照 SnukeSnuke 的网格的样式拼成:与SnukeSnuke 网格中的黑色单元格对应的位置是一个kk级分形;与SnukeSnuke 网格中的白色单元格对应的位置是一个单元格全部为白色,尺寸与kk级分形相同的网格。
    您将得到 SnukeSnuke 的网格的描述和整数 KK。请求出KK级分形中黑色单元格组成的连通分量数,模109+7109+7。

    Input

    ​ 第一行三个整数H,W,K如题目描述

    ​ 接下来H行,每行W个字符

    Output

    ​ 输出KK级分形中黑色单元格组成的连通分量数,模109+7109+7。

    Sample Input

    3 3 3
    .#.
    ###
    #.#
    

    Sample Output

    20
    

    HINT

    本题采用subtask。

    真的抱歉部分分一拖再拖……

    • 存在5%5%的数据满足黑色方块与边界不相连。
    • 存在10%10%的数据满足KK级分形的边长≤2000≤2000。
    • 存在50%50%的数据满足黑色方块与四边界相连。

    对于所有数据:

    • 1≤H,W≤10001≤H,W≤1000
    • 0≤K≤10180≤K≤1018
    • 每个 si,jsi,j是 # 或 .
    • 网格中所有黑色单元格四联通
    • 网格中至少有一个黑色单元格
    .............#.............
    ............###............
    ............#.#............
    ..........#..#..#..........
    .........#########.........
    .........#.##.##.#.........
    ..........#.....#..........
    .........###...###.........
    .........#.#...#.#.........
    ....#........#........#....
    ...###......###......###...
    ...#.#......#.#......#.#...
    .#..#..#..#..#..#..#..#..#.
    ###########################
    #.##.##.##.##.##.##.##.##.#
    .#.....#..#.....#..#.....#.
    ###...######...######...###
    #.#...#.##.#...#.##.#...#.#
    ....#.................#....
    ...###...............###...
    ...#.#...............#.#...
    .#..#..#...........#..#..#.
    #########.........#########
    #.##.##.#.........#.##.##.#
    .#.....#...........#.....#.
    ###...###.........###...###
    #.#...#.#.........#.#...#.#
    

    这个是第一个样例的样例解释

    第二个样例:

    3 3 3
    ###
    #.#
    ###
    
    OUTPUT:1
    

    第三个样例:

    11 15 1000000000000000000
    .....#.........
    ....###........
    ....####.......
    ...######......
    ...#######.....
    ..##.###.##....
    ..##########...
    .###.....####..
    .####...######.
    ###############
    #.##..##..##..#
    
    OUTPUT:301811921
    

    Sol

    %%%DTZ

    其实这题不是很难想,但是看起来太神了觉得不是很可做所以当时就索性放弃了QWQ

    Code

    #include <bits/stdc++.h>
    using namespace std;
    #define P 1000000007
    int n,m,x,y,z;char s[1005][1005],t[1005][1005];long long k;
    struct M
    {
        long long m[5][5];
        M(){memset(m,0,sizeof(m));}
        M operator*(const M &b)const
        {M c;for(int i=1,j,k;i<=2;i++) for(j=1;j<=2;j++) for(k=1;k<=2;k++) (c.m[i][j]+=m[i][k]*b.m[k][j])%=P;return c;}
        M operator^(long long x)const
        {M a(*this),ans;for(int i=1;i<=2;i++)ans.m[i][i]=1;for(;x;x>>=1,a=a*a) if(x&1)ans=ans*a;return ans;}
    }ans;
    int ksm(int x,long long y){int ans=1;for(;y;y>>=1,x=1ll*x*x%P) if(y&1) ans=1ll*ans*x%P;return ans;}
    bool chk(){for(int i=1;i<=n;i++) if(s[i][1]=='#'&&s[i][m]=='#') return 1;return 0;}
    void turn90(){for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) t[m-j+1][i]=s[i][j];swap(n,m);memcpy(s,t,sizeof(s));}
    int main()
    {
        scanf("%d%d%lld",&n,&m,&k);
        for(int i=1,j;i<=n;i++) for(scanf("%s",s[i]+1),j=1;j<=m;j++) x+=s[i][j]=='#';
        bool a=chk(),b=(turn90(),chk());turn90();
        if(a&&b) return printf("1"),0;
        else if(!a&&!b) return printf("%d",ksm(x,k-1)),0;
        else if(b) turn90();
        for(int i=1;i<=n;i++) z+=s[i][1]=='#'&&s[i][m]=='#';
        for(int i=1;i<=n;i++) for(int j=1;j<m;j++) y+=s[i][j]=='#'&&s[i][j+1]=='#';
        ans.m[1][1]=x,ans.m[1][2]=y,ans.m[2][2]=z;ans=ans^(k-1);
        printf("%lld",(ans.m[1][1]-ans.m[1][2]+P)%P);
    }
    
  • 相关阅读:
    大数据时代:基于微软案例数据库数据挖掘知识点总结(Microsoft 时序算法)
    大数据时代:基于微软案例数据库数据挖掘知识点总结(结果预测篇)
    svg图片的缩放拖拽
    计算机网络之以太网,通俗点的说法
    yield 与生成器
    安卓开发第一记 android stdio 安装后 新建测试项目报错
    Javascript的异常捕获机制
    小而实用的工具插件集锦(JQGrid,zTree)
    proxifier 注册码 +电脑全局代理设置
    雷林鹏分享:jsp 发送邮件
  • 原文地址:https://www.cnblogs.com/CK6100LGEV2/p/9489691.html
Copyright © 2011-2022 走看看