题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1494

题意:

思路:

int SIZE;

struct matrix
{
    i64 a[N][N];

    void init(int x)
    {
        clr(a,0);
        if(x)
        {
            int i;
            FOR0(i,SIZE) a[i][i]=1;
        }
    }

    matrix operator*(matrix p)
    {
        matrix ans;
        ans.init(0);
        int i,j,k;
        FOR0(k,SIZE) FOR0(i,SIZE) FOR0(j,SIZE)
        {
            ans.a[i][j]+=a[i][k]*p.a[k][j]%mod;
            ans.a[i][j]%=mod;
        }
        return ans;
    }

    matrix pow(i64 n)
    {
        matrix ans,p=*this;
        ans.init(1);
        while(n)
        {
            if(n&1) ans=ans*p;
            p=p*p;
            n>>=1;
        }
        return ans;
    }
};

matrix a;

const int val[]={1,1,1,3,16,125};
int status[N],hash[1<<15];
int S[N],K;
i64 n;
i64 c[N];

void DFS(int dep,int st)
{
    if(dep==K)
    {
        c[SIZE]=1;
        int a[10]={0},i;
        FOR0(i,K) a[st>>(i*3)&7]++;
        FOR0(i,K) c[SIZE]*=val[a[i]];
        status[SIZE]=st;
        hash[st]=SIZE++;
        return;
    }
    int temp=-1,i;
    FOR0(i,dep) upMax(temp,st>>(i*3)&7);
    for(i=0;i<=temp+1;i++)
    {
        DFS(dep+1,st<<3|i);
    }
}

int find(int x)
{
    if(S[x]!=x) S[x]=find(S[x]);
    return S[x];
}

int cal()
{
    int visit[N]={0},tot=0,st=0,i,j;
    for(i=K-1;i>=0;i--) if(!visit[i])
    {
        visit[i]=1;
        st|=tot<<(i*3);
        for(j=i-1;j>=0;j--) if(find(i+1)==find(j+1))
        {
            visit[j]=1,st|=tot<<(j*3);
        }
        tot++;
    }
    return hash[st];
}

void deal(int s,int mask)
{
    int i,j;
    for(i=0;i<=K;i++) S[i]=i;
    for(i=0;i<K;i++) for(j=i+1;j<K;j++)
    {
        if((status[s]>>(i*3)&7)==(status[s]>>(j*3)&7))
        {
            int px=find(i);
            int py=find(j);
            if(px!=py) S[px]=py;
        }
    }
    for(i=0;i<K;i++) if(mask&(1<<i))
    {
        int px=find(i);
        int py=find(K);
        if(px==py) return; //保证无环存在
        S[px]=py;
    }
    for(i=1;i<=K;i++) if(find(i)==find(0)) break;
    if(i>K) return; //保证连通性
    a.a[s][cal()]++;
}

int main()
{
    while(scanf("%d%lld",&K,&n)!=-1)
    {
        a.init(0);
        SIZE=0;
        DFS(0,0);
        int i,j;
        FOR0(i,SIZE) FOR0(j,1<<K) deal(i,j);
        a=a.pow(n-K);
        i64 ans=0;
        FOR0(i,SIZE) (ans+=c[i]*a.a[i][0])%=mod;
        printf("%lld\n",ans);
    }
}

  

BZOJ 1494 生成树计数(生成树计数-矩阵)的更多相关文章

  1. bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)

    bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...

  2. bzoj 4031: 小Z的房间 矩阵树定理

    bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...

  3. bzoj 1494 生成树计数

    坑了好多天的题,终于补上了 首先发现 \(i\) 这个点和 \(i-k\) 之前的点没有边,所以 \(i-k\) 之前的点肯定联通,只要处理中间 \(k\) 个点的联通状态就好了.我们用最小表示法,\ ...

  4. 【BZOJ 1494】【NOI 2007】生成树计数

    http://www.lydsy.com/JudgeOnline/problem.php?id=1494 这道题..因为k很小,而且我们只关心连续的k个节点的连通性,所以把连续的k个点轮廓线上的连通性 ...

  5. 生成树的计数 Matrix-Tree(矩阵树)定理

    信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及.事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用.本文从一道信息学竞赛中出现的 ...

  6. HDU 5304(Eastest Magical Day Seep Group&#39;s Summer-环加外向树生成树计数)[Template:Kirchhoff矩阵]

    Eastest Magical Day Seep Group's Summer Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 655 ...

  7. 【BZOJ 4180】 4180: 字符串计数 (SAM+二分+矩阵乘法)

    4180: 字符串计数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 164  Solved: 75 Description SD有一名神犇叫做Oxe ...

  8. 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)

    1016: [JSOI2008]最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树 ...

  9. [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)

    题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...

随机推荐

  1. shell编程之数学运算

    shell数学运算支持整数运算的四种方法 1.let命令 no1=4; no2=5; let result=no1+no2 2.[]操作符 result=$[ no1 + no2] 3.(())操作符 ...

  2. SPOJ-SQRBR Square Brackets

    原题传送:http://www.spoj.pl/problems/SQRBR 动态规划. 设f[i][j]表示前i个位置在合法情况下缺少j个右括号的方案数. 转移方程为: f[i][j] = f[i- ...

  3. 【BZOJ】【1503】 【NOI2004】郁闷的出纳员

    Splay Splay的模板题吧……妥妥的序列操作= =(好像有段时间没写过这种纯数据结构题了……) /************************************************ ...

  4. 委托、事件和Lambda

    一.委托 delegate1.在.Net平台下,委托类型用来定义和响应应用程序中的回调.事实上,.Net委托类型是一个类型安全的对象,指向可以以后调用的其他方法,.Net委托是内置支持多路广播和异步方 ...

  5. load d3dcompiler_46.dll failed

    https://gist.github.com/rygorous/7936047 编shader的时候遇到这个warning不知道是不是什么隐患..从今天开始要做新项目了 尝试从同事那里要了这dll ...

  6. Spring.net Could not load type from string value

    最近有点懒了啊,都没有按时上来博客园更新下,个人觉得遇到难题的时候在这里留下脚印也亦造福他人,进来 晓镜水月 被项目围的团团转,asp.net MVC项目来的,但是我还是不务正业啊,在弄网络爬虫,这个 ...

  7. windows_phone指定时间后执行函数

    开发windows phone 应用程序时需要在一段指定的时间后执行某些函数,于是乎想到了通过DispatcherTimer类来实现,再在.Tick后面添加自己想要的事件 DispatcherTime ...

  8. JavaScript之工厂方式 构造函数方式 原型方式讲解

    一.工厂方式可以为一个对象,创建多个实例. var oCar = new Object; oCar.color = "red"; oCar.doors=4; oCar.mpg=23 ...

  9. BZOJ: 1084: [SCOI2005]最大子矩阵

    NICE 的DP 题,明白了题解真是不错. Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1228  Solved: 622[Submit][Stat ...

  10. IE浏览器上传文件时本地路径变成”C:\fakepath\”的问题【转】

    转自:http://www.iefans.net/ie-shangchuan-bendi-lujing-fakepath/ 在使用<input id="file_upl" t ...