[agc003f]Fraction of Fractal

195人阅读 评论(0) 收藏 举报
分类:

做法

注意到上下左右都联通答案是1,都不连通答案是黑格数的次幂。
判掉后发现只有一边联通很好做,矩阵乘法上就行了。

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int mo=1000000007;
char s[1050][1050];
int sta[80];
int a[2][2],ans[2][2],dis[2][2],o[2][2];
int i,j,l,t,n,m,top,cnt,t1,t2,p1,p2,num;
ll k;
char get(){
    char ch=getchar();
    while (ch!='.'&&ch!='#') ch=getchar();
    return ch;
}
int qsm(int x,ll y){
    if (!y) return 1;
    int t=qsm(x,y/2);
    t=(ll)t*t%mo;
    if (y%2) t=(ll)t*x%mo;
    return t;
}
void mult(int a[2][2],int b[2][2],int c[2][2]){
    int i,j,k;
    fo(i,0,1)
        fo(j,0,1)
            o[i][j]=0;
    fo(k,0,1)
        fo(i,0,1)
            fo(j,0,1)
                o[i][j]=(o[i][j]+(ll)a[i][k]*b[k][j]%mo)%mo;
    fo(i,0,1)
        fo(j,0,1)
            c[i][j]=o[i][j];
}
int main(){
    scanf("%d%d%lld",&n,&m,&k);
    fo(i,1,n)
        fo(j,1,m){
            s[i][j]=get();
            if (s[i][j]=='#'){
                cnt++;
                if (j>1&&s[i][j-1]=='#') t1++;
                if (i>1&&s[i-1][j]=='#') t2++;
            }
        }
    fo(i,1,n)
        if (s[i][1]=='#'&&s[i][m]=='#') p1++;
    fo(i,1,m)
        if (s[1][i]=='#'&&s[n][i]=='#') p2++;
    if (p1<p2){
        swap(p1,p2);
        swap(t1,t2);
    }
    if (k==1||p2){
        printf("1\n");
        return 0;
    }
    if (!p1&&!p2){
        printf("%d\n",qsm(cnt,k-1));
        return 0;
    }
    if (k==2){
        printf("%d\n",cnt-t1);
        return 0;
    }
    fo(i,0,1) ans[i][i]=1;
    a[0][0]=cnt-t1;a[0][1]=-p1;
    dis[0][0]=cnt;dis[1][0]=t1;dis[1][1]=p1;
    k-=2;
    while (k){
        sta[++top]=k%2;
        k/=2;
    }
    while (top){
        mult(ans,ans,ans);
        if (sta[top]) mult(ans,dis,ans);
        top--;
    }
    mult(a,ans,a);
    num=a[0][0];
    (num+=mo)%=mo;
    printf("%d\n",num);
}
查看评论

[矩阵快速幂] Atcoder AGC003 F. Fraction of Fractal

很神的题!!!首先观察一下每次转移如果初始的图案存在某一行 ii,满足行的两个端点为黑,且存在某一列也是满足这样的条件,那么答案就是1,因为原来就连通的黑块转移后的图案也是联通的。如果行和列都不满足,...
  • Coldef
  • Coldef
  • 2017-12-07 20:48:33
  • 112

AGC003 E

题意: 有一个长度为n的序列,初始为1~n。m个操作,每个操作ai表示把当前序列复制无限次,然后取前ai个数作为新序列。问最终序列里1~n各出现多少次。 n,m=a_{i+1}那么ai是无效的,把...
  • u010600261
  • u010600261
  • 2017-03-28 09:25:55
  • 259

[agc003e]Sequential operations on Sequence

前言利用了经典性质的题。题目大意有一个数字串S,初始长度为n,是1 2 3 4 …… n。 有m次操作,每次操作给你一个正整数a[i],你先把S无穷重复,然后把前a[i]截取出来成为新的S。 求m...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017-10-27 10:12:21
  • 296

不要使用不理解或不适用的架构或设计模式

摘自《实战Flash游戏开发》 -- ========================================================== ......我曾亲眼见到人们做过这样的蠢...
  • tiangej
  • tiangej
  • 2012-03-12 15:38:06
  • 436

[贪心 高维前缀和] BZOJ5092. 分割序列

设前缀疑惑和为 sis_i 那么对于每个前缀 sis_i,相当于找一个 sjs_j 使得 sj+(si⊕sj)s_j+(s_i\oplus s_j) 最大从高位往低位贪心,判断是否存在。 可以用...
  • Coldef
  • Coldef
  • 2017-12-09 22:14:31
  • 216

分形软件Ultra Fractal 5.04 破解版下载

Ultra Fractal 分形软件 是分形艺术品的创作工具。不管你是一个图片设计人员、专业的分形艺术家或者是一名新手,都可以很容易地发挥你的创造性来制作漂亮的分形图片、材质和背景。 Ultra ...
  • fengda2870
  • fengda2870
  • 2011-04-04 09:55:00
  • 4157

[转]Ultra Fractal 5.04 破解版汉化包

使用方法:将汉化文件放置到Uf5.exe相同目录下再运行Ultra Fractal 说明:汉化达到95%,有一些地方进行汉化了,但是使用些汉化包依旧是英文显示,不过那些个别的。同样的还有个别单词翻译...
  • fengda2870
  • fengda2870
  • 2011-09-19 18:30:09
  • 2626

Ultra Fractal5汉化版

  • 2013年03月24日 16:28
  • 4.71MB
  • 下载

FerryMan Fractal 1.8

  • 2014年12月19日 02:06
  • 1.37MB
  • 下载

[转]Ultra Fractal教程系列04——快速入门教程01——创建一个分形图像

当您第一次打开UF,默认显示的是Mandelbrot集。由于我们要创建一个全新的分形,让我们关闭这个分形。单击"File"--"Close",关闭的分形窗口。现在,工作区内除了右侧的工具窗口外是空的。...
  • fengda2870
  • fengda2870
  • 2011-06-20 08:48:00
  • 976
    个人资料
    专栏达人 持之以恒
    等级:
    访问量: 39万+
    积分: 1万+
    排名: 1457
    最新评论
    文章分类