线性代数(矩阵乘法):NOI 2007 生成树计数



这道题就是深搜矩阵,再快速幂。
#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 生成树计数的更多相关文章
- Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)
1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 小明最近在为线性代数而头疼, ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
- @总结 - 7@ 生成树计数 —— matrix - tree 定理(矩阵树定理)与 prüfer 序列
目录 @0 - 参考资料@ @0.5 - 你所需要了解的线性代数知识@ @1 - 矩阵树定理主体@ @证明 part - 1@ @证明 part - 2@ @证明 part - 3@ @证明 part ...
- BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...
- [SDOI2009]HH去散步 「矩阵乘法计数」
计数问题也许可以转化为矩阵乘法形式 比如若该题没有不能在一条边上重复走的条件限制,那么直接将邻接矩阵转化为矩阵乘法即可 故 矩阵乘法计数 对于计数问题,若可以将 \(n\) 个点表示成 \(n \ti ...
- 【BZOJ1494】【NOI2007】生成树计数(动态规划,矩阵快速幂)
[BZOJ1494][NOI2007]生成树计数(动态规划,矩阵快速幂) 题面 Description 最近,小栋在无向连通图的生成树个数计算方面有了惊人的进展,他发现: ·n个结点的环的生成树个数为 ...
- 【BZOJ 4180】 4180: 字符串计数 (SAM+二分+矩阵乘法)
4180: 字符串计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 164 Solved: 75 Description SD有一名神犇叫做Oxe ...
- 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]
序列计数 Time Limit: 30 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Alice想要得到一个长度为n的序 ...
- bzoj1494 生成树计数 (dp+矩阵快速幂)
题面欺诈系列... 因为一个点最多只能连到前k个点,所以只有当前的连续k个点的连通情况是对接下来的求解有用的 那么就可以计算k个点的所有连通情况,dfs以下发现k=5的时候有52种. 我们把它们用类似 ...
随机推荐
- 基于Html5的兼容所有主流浏览器的在线视频播放器videoJs
在一个新的项目上需要实现在线视频播放,原本打算借助优酷的视频存储和播放,但是发现这个需要用户注册优酷账户,严重影响用户体验,于是这个方案被毙掉了.于是开始了自己开发一个在线播放器的想法,当然尽量使用已 ...
- 为什么选择我--ReactJS
在页面中如何大面积操作DOM的话,性能肯定是一个很大的问题,然而聪明的ReactJS实现了Virtual DOM技术,这是他的亮点之一.将组件的DOM结构映射到这个Virtual DOM对象上,并且R ...
- Android中的Adapter 详解
http://blog.csdn.net/tianfeng701/article/details/7557819 (一) Adapter介绍 Android是完全遵循MVC模式设计的框架,Activi ...
- youphp学习整理
<?php //后台公共模块 // _list 数据显示 // add 添加/编辑 视图 // insert 添加处理函数 // edit 添加/编辑 视图 // update 更新处理函数 / ...
- Deep Learning学习随记(二)Vectorized、PCA和Whitening
接着上次的记,前面看了稀疏自编码.按照讲义,接下来是Vectorized, 翻译成向量化?暂且这么认为吧. Vectorized: 这节是老师教我们编程技巧了,这个向量化的意思说白了就是利用已经被优化 ...
- 在万网虚拟主机上部署MVC5
参考 要想部署mvc,需要把一些mvc用到的全局程序集改为本地部署,通过N次试验,终于搞定. 特写个备忘录,免得以后忘了. 首先更改web.config,在里面加上 <system.web> ...
- Flyweight 模式
如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字母创建一个对象的话,系统可能会因为大量的对象而造成存 ...
- Java compile时,提示 DeadCode的原因
在工程编译时,编译器发现部分代码是无用代码,则会提示:某一行代码是DeadCode.今天compile工程的时候发现某一个循环出现这个问题,如下: public void mouseOver(fina ...
- centos lnmp 安装笔记
[root@host]# chkconfig nginx on [root@host]# service nginx start [root@host]# service nginx stop [ro ...
- extjs中gridpanel动态显示/隐藏列
在extjs3中,大家知道用 myGrid.getColumnModel().setHidden(i,true);但到了4.0后,已经没有getColumnModel这个方法了,我们在Ext.pane ...