线性代数(矩阵乘法):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种. 我们把它们用类似 ...
随机推荐
- iOS UIKit:Auto Layout
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...
- 10.31 morning
NP(np)Time Limit:1000ms Memory Limit:64MB题目描述LYK 喜欢研究一些比较困难的问题,比如 np 问题.这次它又遇到一个棘手的 np 问题.问题是这个样子的:有 ...
- html px em pt长度单位(像素 相对长度 点)知识(转)
html px em pt单位区 一.PX\EM\PT单位介绍 px单位名称为像素,相对长度单位,像素(px)是相对于显示器屏幕分辨率而言的国内推荐:em单位名称为相对长度单位.相对于当前对象内文本的 ...
- CentOS安装最新的Mysql版本
Step1: 检测系统是否自带安装mysql # yum list installed | grep mysql Step2: 删除系统自带的mysql及其依赖命令: # yum -y remove ...
- 我的网站终于连续一星期,ip数1000以上了
相信每个程序员都有一个站长梦,我也是如此.说来惭愧,从2015年4月份开始,我投入了50块的域名费用,50块的空间费用,现在才回本. 由于终于从百度联盟的手里赚了一百块,按耐不住的菜鸟之冲动,于是决定 ...
- PHP环境搭建所遇到的问题
下午学校的机房搭建PHP组合包appserv开发环境的时候是没有任何问题的,但是到了自己的电脑上以后下砸的32位appserve一直无法正常由浏览器的localhos或者127.0.0.1 进入其ap ...
- OC - 29.自定义布局实现瀑布流
概述 瀑布流是电商应用展示商品通常采用的一种方式,如图示例 瀑布流的实现方式,通常有以下几种 通过UITableView实现(不常用) 通过UIScrollView实现(工作量较大) 通过UIColl ...
- Linux 添加epel源
1.epel-release yum install epel-release 这样有些没办法通过yum 安装 可以这样安装(例如redis)
- 将日期和时间作为 struct tm型的值直接向二进制文件进行读写
#include <stdio.h> #include <time.h> char data_file[]="D:\\%\\datetime.dat"; v ...
- SGU 156. Strange Graph(欧拉路)
时间限制:0.25s 空间限制:6M 题目描述 让我们想象一个无向图G=<V,E>.如果边(u,v)在边集E中,那么我们就说两个顶点u和v是邻接点.在这种情况下,我们也说u是v的一个邻接点 ...