线性代数(矩阵乘法):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种. 我们把它们用类似 ...
随机推荐
- 【转载】Shared Configuration
Introduction The Internet changes the ways in which companies handle their day-to-day business and h ...
- phpstorm 快捷方式 (备用)
常用快捷键 设置快捷键:File -> Settings -> IDE Settings -> Keymap -> 选择“eclipse” -> 然后“Copy”一份 ...
- 如何消除inline-block产生的元素间空隙
前端初学者可能都会碰到这个问题:有时候排版需要,会把一些块状元素的display属性设置为inline-block,如 <!-- HTML代码 --> <div class=&quo ...
- 【转】纯 CSS 实现高度与宽度成比例的效果
先来演示页面:Demo; 转的内容: 最近在做一个产品列表页面,布局如右图所示.页面中有若干个 item,其中每个 item 都向左浮动,并包含在自适应浏览器窗口宽度的父元素中. item 元素的 C ...
- Java-Android 之单选按钮的运用
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- 修改docker默认172.17网段
docker启动时默认使用172.17.x.x作为容器的ip地址,可以通过以下方法自定义该网段: sudo service docker stop通过命令route -n查看docker0是否存在,若 ...
- 制作SSL证书
上一节介绍了OpenSSL的目录结构,本节介绍一下SSL证书的制作. OpenSSL安装后建议把其中的bin目录添加到系统环境变量中,方便以后操作. 建立一个新的目录SSL专门用来制作证书. 建立证书 ...
- 【转】IOS AutoLayout详解(三)用代码实现(附Demo下载)
转载自:blog.csdn.net/hello_hwc IOS SDK详解 前言: 在开发的过程中,有时候创建View没办法通过Storyboard来进行,又需要AutoLayout,这时候用代码创建 ...
- Mvvm绑定datagrid或listview的selectItems的方法[转]
单选,很简单,将SelectedItem与ViewModel的属性进行双向绑定就OK了 多选,由于ListView的SelectedItems不能进行绑定,需要将ListView的SelectionC ...
- C /CLI思辨录[阅读记录]
C /CLI思辨录之拷贝构造函数(避免多个实例在相同的堆对象的错误处理) http://west263.com/info/html/chengxusheji/C-C--/20080224/9247.h ...