[BZOJ1494][NOI2007]生成树计数 状压dp 并查集
1494: [NOI2007]生成树计数
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 793 Solved: 451
[Submit][Status][Discuss]
Description
.png)

.png)
.png)
.png)

.png)
.png)
Input
包含两个整数k,n,由一个空格分隔。k表示要将所有距离不超过k(含k)的结点连接起来,n表示有n个结点。
Output
输出一个整数,表示生成树的个数。由于答案可能比较大,所以你 只要输出答案除65521 的余数即可。
Sample Input
Sample Output
HINT

Source
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 150
#define mod 65521
using namespace std;
int size[]={,,,,,};
long long n,k;int cnt;
struct data {
long long mat[maxn+][maxn+];
data() {memset(mat,,sizeof(mat));}
data operator *(const data t1) {
data tp;
for(int i=;i<=cnt;i++)
for(int j=;j<=cnt;j++)
for(int k=;k<=cnt;k++) tp.mat[i][j]+=mat[i][k]*t1.mat[k][j],tp.mat[i][j]%=mod;
return tp;
}
}A,B;
int hash[],sta[];
int fa[];
int find(int x){return fa[x]==x?fa[x]:fa[x]=find(fa[x]);}
void prepare(int pos,int now,int ma) {
if(pos==k+) {
hash[now]=cnt++;
sta[cnt-]=now;
return;
}
for(int i=;i<=ma;i++) prepare(pos+,now+(i<<(*(pos-))),ma+(i==ma));
}
int get() {
int h[];
memset(h,-,sizeof(h));
int re=;
int cc=;
for(int i=;i<=k+;i++) {
if(h[find(i)]==-) h[find(i)]=++cc;
}
for(int i=;i<=k+;i++) {
int now=h[find(i)];
re+=(now<<(*(i-)));
}
return hash[re];
}
void build(int x,int add) {
int now=sta[x];
for(int i=;i<=k+;i++) fa[i]=i;
for(int i=;i<=k;i++) {
for(int j=i+;j<=k;j++) {
if(((now>>((i-)*))&)==((now>>((j-)*))&)) {
int f1=find(i),f2=find(j);
if(f1!=f2) fa[f1]=f2;
}
}
}
for(int i=;i<=k;i++) {
if(add&(<<(i-))) {
int f1=find(i),f2=find(k+);
if(f1==f2) return;
fa[f1]=f2;
}
}
bool flag=;
for(int i=;i<=k+;i++) {
if(find()==find(i)) {flag=;break;}
}
if(!flag) return;
A.mat[get()][x]++;
}
data pow(data x,long long p) {
data ans;
for(int i=;i<=maxn;i++) ans.mat[i][i]=;
while(p) {
if(p&) ans=ans*x;
x=x*x;
p>>=; }
return ans;
}
int main() {
for(int i=;i<=maxn;i++) B.mat[i][]=;
scanf("%lld%lld",&k,&n);
prepare(,,);
for(int i=;i<cnt;i++)
for(int j=;j<(<<k);j++) build(i,j);
/*for(int i=0;i<cnt;i++) {
for(int j=0;j<=k;j++) cout<<A.mat[i][j]<<' ';
cout<<endl;
}*/
for(int i=;i<cnt;i++) {
int now=sta[i];
int tmp[]={};
for(int j=;j<=k;j++) tmp[now>>((j-)*)&]++;
for(int j=;j<=k;j++) B.mat[i][]*=size[tmp[j]];
} A=pow(A,n-k);
A=A*B;
printf("%lld",A.mat[][]%mod);
}
[BZOJ1494][NOI2007]生成树计数 状压dp 并查集的更多相关文章
- HDU5117 Fluorescent 期望 计数 状压dp 动态规划
原文链接https://www.cnblogs.com/zhouzhendong/p/HDU5117.html 题目传送门 - HDU5117 题意 $T$ 组数据. 给你 $n$ 盏灯 ,$m$ 个 ...
- BZOJ1494 [NOI2007]生成树计数
题意 F.A.Qs Home Discuss ProblemSet Status Ranklist Contest 入门OJ ModifyUser autoint Logout 捐赠本站 Probl ...
- CCPC-Wannafly Winter Camp Day3 Div1 - 精简改良 - [生成树][状压DP]
题目链接:https://zhixincode.com/contest/14/problem/D?problem_id=206 样例输入 1 5 5 1 2 1 1 3 1 2 4 1 2 5 1 ...
- hdu5304 Eastest Magical Day Seep Group's Summer 状压dp+生成树
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5304 16个点的无向图,问能生成多少个n条边的连通图.(即多一条边的树) 先n^3 * 2^n 枚举全部的 ...
- 状态压缩动态规划 状压DP
总述 状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式 很多棋盘问题都运用到了状压,同时,状压也很经常和BFS及DP连用,例题里会给出介绍 有了状态,DP就比 ...
- AGC 016 F - Games on DAG(状压dp)
题意 给你一个有 \(n\) 个点 \(m\) 条边 DAG 图,点的标号和拓扑序一致. 现在有两个人进行博弈,有两个棋子分别在 \(1, 2\) 号点上,需要不断移动到它指向的点上. 如果当前两个点 ...
- P1879 [USACO06NOV]玉米田Corn Fields 状压dp/插头dp
正解:状压dp/插头dp 解题报告: 链接! ……我真的太菜了……我以为一个小时前要搞完的题目调错误调了一个小时……90分到100我差不多搞了一个小时…… 然后这题还是做过的……就很气,觉得确实是要搞 ...
- BZOJ.3058.四叶草魔杖(Kruskal 状压DP)
题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...
- 【ZJOI2017 Round1练习&BZOJ4774】D3T2 road(斯坦纳树,状压DP)
题意: 对于边带权的无向图 G = (V, E),请选择一些边, 使得1<=i<=d,i号节点和 n − i + 1 号节点可以通过选中的边连通, 最小化选中的所有边的权值和. d< ...
随机推荐
- Java相关配置合集
Java环境变量配置: 1.安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为C:\java\jdk1.6.0_08: 2.安装完成后,右击“我的电脑”,点击“属性”: 3.XP选 ...
- Web-Servlet处理表单
- 【PHP】- include、require、include_once 和 require_once的区别
1.include:会将指定的档案读入并且执行里面的程序. 被导入的档案中的程序代码都会被执行,而且这些程序在执行的时候会拥有和源文件中呼叫到 include() 函数的位置相同的变量范围( ...
- HL7 2.6 解析(XML)
用途:检验化验(LIS)实验室设备数据交换解析. using System; using System.Collections.Generic; using System.Text; using Sy ...
- [Java] 文件上传下载项目(详细注释)
先上代码,最上方注释是文件名称(运行时要用到) FTServer.java /* FTServer.java */ import java.util.*; import java.io.*; publ ...
- delphi Edit 控制最大值,只能输入数字型 控制小数位数
delphi语言受众多程序员追捧,主要原因之一就是它有很多第三方的控件可供使用.很多资深的delphi程序员都把自己积累的函数.过程等设计成控件,以方便使用,提高开发效率. 本文通过一个只允许输入数字 ...
- 周记【距gdoi:96天】
倒计时从三位数变成了两位数. 然后这周还是很不知道怎么说,经常写一道题写两天.但是总算把后缀数组写完了,也整理完了. 然后周末都不知道干了什么周末就过去了.无聊看了两道省选题发现都是不会做系列,看了以 ...
- Educational Codeforces Round 54 (Rated for Div. 2) ABCD
A. Minimizing the String time limit per test 1 second memory limit per test 256 megabytes Descriptio ...
- ACM模板~求逆序对的个数
#include <map> #include <set> #include <cmath> #include <ctime> #include < ...
- linux 学习好资源
Linux-Wiki.cn http://linux-wiki.cn/wiki/zh-hans/Linux%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84 Linux目录 ...