真是菜到爆炸。。。。容斥写反(反正第一次写qwq)


题意:$n-1$个公司,每个公司可以连一些边,求每个边让不同公司连的生成树方案数。

矩阵树定理+容斥原理(注意到$n$不是很大)

枚举公司参与与否的状态,每次重构矩阵,把参与连边的公司可以连的边写在矩阵中,然后求出方案。

代码中的$Gauss()$是辗转相除求解,$Gauss2()$是通过求逆元求解(貌似我的辗转相除更快(雾))

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<vector>
  5. #define ll long long
  6. #define R register ll
  7. char B[<<],*S=B,*T=B;
  8. #define getchar() (S==T&&(T=(S=B)+fread(B,1,1<<15,stdin),S==T)?EOF:*S++)
  9. const int M=;
  10. using namespace std;
  11. inline int g() {
  12. R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
  13. do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
  14. }
  15. int n,ans=,C; ll a[][]; vector<pair<int,int> > q[];
  16. #define pb push_back
  17. inline int Gauss() { ll ans=;
  18. for(R i=;i<n;++i) {
  19. for(R j=i+;j<n;++j) while(a[j][i]) {
  20. ll t=a[i][i]/a[j][i];
  21. for(R k=i;k<n;++k) (a[i][k]-=t*a[j][k])%=M;
  22. swap(a[i],a[j]); ans=-ans;
  23. } ans=(ans*a[i][i])%M; if(!ans) return ;
  24. } return (ans+M)%M;
  25. }
  26. inline ll Inv(int x) {
  27. if(x==) return ; if(x<) return ;
  28. return (M-M/x*Inv(M%x))%M;
  29. }
  30. inline int Gauss2() { register ll ans=;
  31. for(R i=;i<n;++i) for(R j=i+;j<n;++j) {
  32. if(!a[i][i]) return ; if(!a[j][i]) continue;
  33. register ll t=(ll)a[j][i]*Inv(a[i][i]%M)%M;
  34. for(R k=i;k<n;++k) a[j][k]=((a[j][k]-t*a[i][k])%M+M)%M;
  35. } for(R i=;i<n;++i) ans=ans*a[i][i]%M; return ans;
  36. }
  37. signed main() {
  38. n=g(); for(R i=,x;i<n;++i) { x=g();
  39. for(R j=,u,v;j<=x;++j) u=g(),v=g(),q[i].pb(make_pair(u,v));
  40. } C=<<(n-);
  41. for(R i=;i<C;++i) { R cnt=; memset(a,,sizeof(a));
  42. for(R j=;j<n;++j) if(i&(<<j-)) {
  43. for(R k=,u,v;k<q[j].size();++k)
  44. u=q[j][k].first,v=q[j][k].second,
  45. ++a[u][u],++a[v][v],--a[u][v],--a[v][u];
  46. ++cnt;
  47. } if((n-cnt)&) ans=(ans+Gauss2())%M;
  48. else ans=(ans-Gauss2()+M)%M;
  49. } printf("%lld\n",ans);
  50. }

2019.06.02

Luogu P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理+容斥原理的更多相关文章

  1. bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥)

    bzoj4596/luoguP4336 [SHOI2016]黑暗前的幻想乡(矩阵树定理,容斥) bzoj Luogu 题解时间 看一看数据范围,求生成树个数毫无疑问直接上矩阵树定理. 但是要求每条边都 ...

  2. bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 559  Solved: 325[Submit][Sta ...

  3. 【BZOJ4596】【Luogu P4336】 [SHOI2016]黑暗前的幻想乡 矩阵树定理,容斥

    同样是矩阵树定理的裸题.但是要解决它需要能够想到容斥才可以. \(20\)以内的数据范围一定要试试容斥的想法. #include <bits/stdc++.h> using namespa ...

  4. [SHOI2016] 黑暗前的幻想乡 - 矩阵树定理,容斥

    #include <bits/stdc++.h> using namespace std; #define int long long const int N = 20; const in ...

  5. P4336 [SHOI2016]黑暗前的幻想乡

    P4336 [SHOI2016]黑暗前的幻想乡 矩阵树定理(高斯消元+乘法逆元)+容斥 ans=总方案数 -(公司1未参加方案数 ∪ 公司2未参加方案数 ∪ 公司3未参加方案数 ∪ ...... ∪ ...

  6. 题解 P4336 [SHOI2016]黑暗前的幻想乡

    题解 前置芝士 :矩阵树定理 本题是一道计数题,有两个要求: 建造的公路构成一颗生成树 每条公路由不同的公司建造,每条公路与一个公司一一映射 那么看到这两个要求后,我们很容易想到第一个条件用矩阵树定理 ...

  7. 洛谷P4336 [SHOI2016]黑暗前的幻想乡 [Matrix-Tree定理,容斥]

    传送门 思路 首先看到生成树计数,想到Matrix-Tree定理. 然而,这题显然是不能Matrix-Tree定理硬上的,因为还有每个公司只能建一条路的限制.这个限制比较恶心,尝试去除它. 怎么除掉它 ...

  8. bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 464  Solved: 264[Submit][Sta ...

  9. [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)

    这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...

随机推荐

  1. Kubernetes---Service(SVC)服务

    ⒈介绍 kubernetes 通过标签选择的方式来匹配一组pod,然后提供对外访问的一种机制 一组pod可以对应到多个svc的 每一个service(svc)都可以理解为一个微服务 Service有且 ...

  2. Ubuntu系统降内核

    本人安装的Ubuntu16.04.6系统原生内核为4.15.0,但安装的应用仅支持4.8.0以下内核,因此需要降内核.PS:降内核有风险,操作前请慎重 1.查看可用的内核 输入命令查看已经可用的内核 ...

  3. HTNL基础之四

    11.<nav>导航元素 标签定义及使用说明 表示页面中导航链接的部分,例如:传统导航条,侧边栏导航,页内导航,翻页等 <nav> 标签定义导航链接的部分. 并不是所有的 HT ...

  4. phpstorm右侧边栏怎么打开?

    开启PHPstorm右侧边栏的方法: 一般phpstorm默认只能打开10个文件,超过就隐藏了,想要打开更多:

  5. 监控提示message

    见文件 监控提示message.rar ---可作时时监控提示功能

  6. javaIO——概述

    以前看java书,都将IO作为一个大的章节甚至模块来编写,可见IO在java语言中的重要性. java的流按功能和处理的目标数据不同可以分为字节流和字符流.字符流处理的基本数据单元是字符:字节流处理的 ...

  7. HTTP请求方式及其区别

    一.请求方式 所有的请求都可以给服务器传递内容,也可以从服务器获取内容. GET:从服务器获取数据(给的少拿的多) POST:向服务器推送数据(给的多拿的少) DELETE:删除服务器的一些内容 PU ...

  8. react快速上手一(使用js语法,创建虚拟DOM元素)

    1.装包,引包 首先需要安装两个包 react ,react-dom cnpm i react react-dom 介绍下这两个包: react:专门用来创建React组件,组件生命周期等这些东西. ...

  9. 安卓开发之利用XmlSerializer生成XML文件

    package com.lidaochen.phonecall; import android.net.Uri; import android.os.Environment; import andro ...

  10. 如何将公式插入到word

    平台:win10 x64+ office 2010+ Mathpix Snipping Tool +mathtype6.9b   直接安装就行,下载好了以后,要和word连接起来还需要下载一个插件,有 ...