BZOJ 1494 生成树计数(生成树计数-矩阵)
题目链接: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 生成树计数(生成树计数-矩阵)的更多相关文章
- bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)
bzoj 2111: [ZJOI2010]Perm 排列计数 1 ≤ N ≤ 10^6, P≤ 10^9 题意:求1~N的排列有多少种小根堆 1: #include<cstdio> 2: ...
- bzoj 4031: 小Z的房间 矩阵树定理
bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...
- bzoj 1494 生成树计数
坑了好多天的题,终于补上了 首先发现 \(i\) 这个点和 \(i-k\) 之前的点没有边,所以 \(i-k\) 之前的点肯定联通,只要处理中间 \(k\) 个点的联通状态就好了.我们用最小表示法,\ ...
- 【BZOJ 1494】【NOI 2007】生成树计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1494 这道题..因为k很小,而且我们只关心连续的k个节点的连通性,所以把连续的k个点轮廓线上的连通性 ...
- 生成树的计数 Matrix-Tree(矩阵树)定理
信息学竞赛中,有关生成树的最优化问题如最小生成树等是我们经常遇到的,而对生成树的计数及其相关问题则少有涉及.事实上,生成树的计数是十分有意义的,在许多方面都有着广泛的应用.本文从一道信息学竞赛中出现的 ...
- HDU 5304(Eastest Magical Day Seep Group's Summer-环加外向树生成树计数)[Template:Kirchhoff矩阵]
Eastest Magical Day Seep Group's Summer Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 655 ...
- 【BZOJ 4180】 4180: 字符串计数 (SAM+二分+矩阵乘法)
4180: 字符串计数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 164 Solved: 75 Description SD有一名神犇叫做Oxe ...
- 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)
1016: [JSOI2008]最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树 ...
- [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)
题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...
随机推荐
- C#做音乐播放器时在自动下一曲中报异常的解决办法
---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 在利用Media Player做音乐播放器的时 ...
- 【BZOJ】【3473】字符串
后缀数组 Orz zyf 神题不会做啊,先坑着吧……sigh //BZOJ 3473 #include<vector> #include<cstdio> #include< ...
- Linux命令 + Shell
1. 之前利用Ubuntu14.10的镜像安装了个虚拟机,本以为自己在windows上的就是管理员的权限,就理所当然的认为虚拟的Linux系统也是root权限.而且虽然@符号前的的标识不是root,但 ...
- The life of an HTML HTTP request
https://developer.mozilla.org/en-US/docs/The_life_of_an_HTML_HTTP_request http://www.html5rocks.com/ ...
- 腾讯开源的轻量级CSS3动画库:JX.Animate
JX.Animate 是由腾讯前端团队 AlloyTeam 推出的一个 CSS3 动画库,通过 JX(腾讯的前端框架)插件的形式提供. Why CSS3 众所周知在支持HTML5的浏览器中 ...
- Map:比较新增加日期的和需要删除的日期 使用方法
1.场景描述:根据在日历选择的日期,数据库来保持我们选择日期. 2.方法,硬删除的方法,每次全部删除,然后再重新添加选择的新的日期.这样导致如果需要保存create_time的情况,那么每次操作的都是 ...
- 如何使用 OneAPM 监控微软 Azure Cloud Service ?
不知不觉微软 Azure 已经进入中国市场近两年的时间.那么 Azure 平台的性能究竟如何?资源加载的延迟.虚拟机的稳定性等问题是否切实满足客户期许.这些都是大家对微软 Azure 这个国外的云服务 ...
- POJ 3253 Fence Repair(优先队列,哈夫曼树,模拟)
题目 //做哈夫曼树时,可以用优先队列(误?) //这道题教我们优先队列的一个用法:取前n个数(最大的或者最小的) //哈夫曼树 //64位 //超时->优先队列,,,, //这道题的优先队列用 ...
- 这个东西,写C++插件的可以用到。 RapidJSON —— C++ 快速 JSON 解析器和生成器
点这里 原文: RapidJSON —— C++ 快速 JSON 解析器和生成器 时间 2015-04-05 07:33:33 开源中国新闻原文 http://www.oschina.net/p/ ...
- login shell 和 non-login shell 的区别
介绍之前先思考一个问题:有时我们通过su命令切换用户后,却发现并没有进入该用户的shell环境.这是为什么? login shell:取得bash时需要完整的登录流程.就是说通过输入账号和密码登录系统 ...