这道题就是深搜矩阵,再快速幂。

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;
const int maxn=;
const int mod=;
struct Matrix{
long long mat[maxn][maxn];
int r,c;
Matrix(int r_=,int c_=,int on=){
memset(mat,,sizeof(mat));
r=r_;c=c_;
if(on)for(int i=;i<=r;i++)mat[i][i]=;
}
Matrix operator *(Matrix a){
Matrix ret(r,a.c);
long long l;
for(int i=;i<=r;i++)
for(int k=;k<=c;k++){
l=mat[i][k];
for(int j=;j<=a.c;j++)
(ret.mat[i][j]+=(l*a.mat[k][j])%mod)%=mod;
}
return ret;
}
Matrix operator ^(long long k){
Matrix ret(r,c,),x(r,c);
for(int i=;i<=r;i++)
for(int j=;j<=c;j++)
x.mat[i][j]=mat[i][j];
while(k){
if(k&)
ret=ret*x;
k>>=;
x=x*x;
}
return ret;
}
}A,B; long long n;
map<int,int>ID;
map<int,bool>used;
int k,e,e1,E[maxn][];
int cnt,st[<<],mem[<<];
int fa[maxn],sz[maxn],vis[maxn];
int Find(int x){
return x==fa[x]?x:fa[x]=Find(fa[x]);
}
bool Check(int s){
for(int i=;i<maxn;i++)
fa[i]=i,sz[i]=;
for(int i=;i<e+e1;i++)
if(s&(<<i)){
int u=Find(E[i][]),v=Find(E[i][]);
if(u!=v){fa[u]=v;sz[v]+=sz[u];}
else return false;
}
return true;
} void Solve(int x){
for(int i=;i<=x;i++)
for(int j=i+;j<=x;j++)
E[e][]=i,E[e][]=j,e++;
for(int i=;i<=x;i++)
E[e+e1][]=i,E[e+e1][]=x+,e1++; for(int s=(<<e)-,num;s>=;s--)
if(Check(s)){
memset(vis,,sizeof(vis));num=;
for(int i=;i<=x;i++){
if(vis[Find(i)])continue;
vis[Find(i)]=++num;
}
num=;
for(int i=;i<=x;i++)
num=num*+vis[Find(i)];
if(ID[num])B.mat[ID[num]][]+=;
else{
A.r+=;A.c+=;B.r+=;
B.mat[ID[num]=B.r][]=;
st[++cnt]=s;mem[cnt]=num;
}
} for(int t=,s;t<=cnt;t++){
for(int p=(<<e1)-,num;p>=;p--){
s=st[t]^(p<<e);
if(Check(s)&&sz[Find()]!=){
memset(vis,,sizeof(vis));num=;
for(int i=;i<=x+;i++){
if(vis[Find(i)])continue;
vis[Find(i)]=++num;
}
num=;
for(int i=;i<=x+;i++)
num=num*+vis[Find(i)];
A.mat[ID[num]][ID[mem[t]]]+=;
}
}
}
return;
} int main(){
#ifndef ONLINE_JUDGE
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
#endif
scanf("%d%lld",&k,&n);
k=min(1ll*k,n);Solve(k);B.c=;
A=A^((n-k)%(1ll*(mod+)*(mod-)));B=A*B;
printf("%lld\n",B.mat[][]);
return ;
}

线性代数(矩阵乘法):NOI 2007 生成树计数的更多相关文章

  1. Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)

    1287 矩阵乘法  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 小明最近在为线性代数而头疼, ...

  2. 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 359 Description Al ...

  3. @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列

    目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...

  4. BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法

    BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...

  5. [SDOI2009]HH去散步 「矩阵乘法计数」

    计数问题也许可以转化为矩阵乘法形式 比如若该题没有不能在一条边上重复走的条件限制,那么直接将邻接矩阵转化为矩阵乘法即可 故 矩阵乘法计数 对于计数问题,若可以将 \(n\) 个点表示成 \(n \ti ...

  6. 【BZOJ1494】【NOI2007】生成树计数(动态规划,矩阵快速幂)

    [BZOJ1494][NOI2007]生成树计数(动态规划,矩阵快速幂) 题面 Description 最近,小栋在无向连通图的生成树个数计算方面有了惊人的进展,他发现: ·n个结点的环的生成树个数为 ...

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

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

  8. 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]

    序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Alice想要得到一个长度为n的序 ...

  9. bzoj1494 生成树计数 (dp+矩阵快速幂)

    题面欺诈系列... 因为一个点最多只能连到前k个点,所以只有当前的连续k个点的连通情况是对接下来的求解有用的 那么就可以计算k个点的所有连通情况,dfs以下发现k=5的时候有52种. 我们把它们用类似 ...

随机推荐

  1. 段落排版--缩进(text-indent)

    中文文字中的段前习惯空两个文字的空白,这个特殊的样式可以用下面代码来实现: p{text-indent:2em;} <p>1922年的春天,一个想要成名名叫尼克卡拉威(托比?马奎尔Tobe ...

  2. javascript基础学习(六)

    javascript之对象 学习要点: 对象的属性和方法 对象的原型 一.对象 对象其实就是一种引用类型,而对象的值就是引用对象的实例. 二.创建对象 在javascript中有两种对象,一种是系统内 ...

  3. Flyweight 模式

    如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字母创建一个对象的话,系统可能会因为大量的对象而造成存 ...

  4. nginx+php,502错误

    502错误基本就是php进程执行中挂了,其中有个原因就可能是进程执行超时设置导致的比如这个: ; The timeout for serving a single request after whic ...

  5. SQL 结构化查询语言

    SQL 结构化查询语言 一.数据库的必要性: >>作用:存储数据.检索数据.生成新的数据 1)可以有效结构化存储大量的数据信息,方便用户进行有效的检索和访问. 2)可以有效地保持数据信息的 ...

  6. php之文件上传类代码

    /* 单个文件上传 功能 上传文件 配置允许的后缀 配置允许的大小 获取文件后缀 判断文件的后缀 报错 */ class UpTool{ protected $allowExt = 'jpg,jpeg ...

  7. php基础知识【函数】(4)时间date

    一.time() -- 返回当前的 Unix 时间戳 $nextWeek = time() + (7 * 24 * 60 * 60); echo 'Next Week: '. date('Y-m-d' ...

  8. VC++ 列表控件的使用方法

    列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值.MFC中使用CListCtrl类来封装列表控件的各种操作. 通过调用BOOL Create( DWORD ...

  9. FASTMM,FASTCODE,FASTMOVE请移步

    http://blog.csdn.net/akof1314/article/details/6524767

  10. smali文件语法参考

    Dalvik opcodes Author: Gabor Paller Vx values in the table denote a Dalvik register. Depending on th ...