[Shoi2016] bzoj 4596 黑暗前的幻想乡 - 容斥 - 矩阵树定理 - 学习笔记II

5人阅读 评论(0) 收藏 举报
分类:

和小星星那个题一样,随便上一波容斥矩阵树即可。
矩阵树定理求的是边权乘积之和,所以可以做形如“恰好有k条黑边”的树计数(跑差值即可)等等。
代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<utility>
#include<vector>
#define fir first
#define sec second
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define lint long long
#define mod 1000000007
#define inv(x) fast_pow(x,mod-2)
#define N 20
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
typedef pair<int,int> pii;
int n,g[N][N];
inline int fast_pow(int x,int k)
{
    int ans=1;
    for(;k;x=(lint)x*x%mod,k>>=1)
        if(k&1) ans=(lint)ans*x%mod;
    return ans;
}
inline int calc(int n)
{
    int det=1,v,t;
//  for(int i=1;i<=n;i++,cout ln)
//      for(int j=1;j<=n;j++) cout<<g[i][j]<<" ";
    rep(i,1,n)
    {
        v=inv(g[i][i]),det=(lint)det*v%mod;
        rep(j,i,n) g[i][j]=(lint)g[i][j]*v%mod;
        rep(j,1,n) if((i^j)&&(t=g[j][i]))
            rep(k,i,n) g[j][k]=(g[j][k]-(lint)t*g[i][k]%mod+mod)%mod;
    }
    return inv(det);
}
bool cb[N];vector<pii> e[N];
inline int solve(int S)
{
    for(int i=1;i<n;i++) cb[i]=true;
    for(int i=0;i<n-1;i++) if((S>>i)&1) cb[i+1]=false;
    memset(g,0,sizeof(g));
    for(int i=1;i<n;i++) if(cb[i])
        for(int j=0,x,y;j<(int)e[i].size();j++)
            x=e[i][j].fir,y=e[i][j].sec,g[x][y]--,g[y][x]--,g[x][x]++,g[y][y]++;
    rep(i,1,n) rep(j,1,n) (g[i][j]+=mod)%=mod;return calc(n-1);
}
inline int gsgn(int x,int y)
{
    int c=0;
    for(int i=0;i<n-1;i++)
        if((x>>i)&1) c^=1;
    return c?(mod-y)%mod:y;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int c;scanf("%d",&c);
        while(c--)
        {
            int x,y;scanf("%d%d",&x,&y);
            e[i].push_back(make_pair(x,y));
        }
    }
    int all=(1<<(n-1))-1,ans=0;
    rep(i,0,all) (ans+=gsgn(i,solve(i)))%=mod;
    return !printf("%d\n",ans);
}
查看评论

[BZOJ4596][Shoi2016]黑暗前的幻想乡(容斥原理+矩阵树定理)

题目描述传送门题解首先容斥一下 答案=至少没有公司没有路-至少一个公司没有路+至少两个公司没有路-至少三个公司没有路… 217−12^{17-1}枚举哪些公司没有路,然后将这些公司的路去掉 一个...
  • Clove_unique
  • Clove_unique
  • 2017-03-24 21:13:25
  • 451

bzoj4596: [Shoi2016]黑暗前的幻想乡

4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 92  Solved: 60 [Submit][...
  • qq_30324855
  • qq_30324855
  • 2016-06-12 09:34:58
  • 757

BZOJ4596 [Shoi2016]黑暗前的幻想乡

KuribohG神犇说过,看到计数想容斥 把每个公司能负责的边都视作不同的,这样就变为生成树中每个集合里选一个的方案数 考虑容斥,每个集合选一个的等于任意选的方案数-sigma i一定没选的+si...
  • neither_nor
  • neither_nor
  • 2016-06-13 19:55:10
  • 1601

4596: [Shoi2016]黑暗前的幻想乡

4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 212  Solved: 135 [Submit...
  • CRZbulabula
  • CRZbulabula
  • 2016-12-17 20:42:49
  • 565

BZOJ 4596: [Shoi2016]黑暗前的幻想乡

迷之正确性的做法 首先观察数据范围,哎和ZJOI的小星星一毛一样啊,会不会给人一种钦定复杂度的感觉啊 于是就乱搞一发,容斥+Matrix定理 莫名其妙地就过了QAQ #include #include...
  • nlj1999
  • nlj1999
  • 2016-05-26 21:11:56
  • 803

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

题意有n个点,n-1个公司,每个公司可以生产一些固定的边。问每一条边都让不同的公司来制造的生成树数量是多少。 n...
  • qq_33229466
  • qq_33229466
  • 2017-04-06 15:18:43
  • 276

[bzoj4596][SHOI2016]黑暗前的幻想乡

题目描述四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序。但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪平等,幻想乡...
  • WerKeyTom_FTD
  • WerKeyTom_FTD
  • 2017-02-21 22:28:18
  • 556

BZOJ4596: [Shoi2016]黑暗前的幻想乡

BZOJ4596题意:有NN个城市,N−1N-1个公司,每个公司可以修建的路有mim_i条。 让每个公司修一条路,使得NN个城市构成一棵树 。求方案数。学习了一下高斯消元的辗转相除做法。QAQQAQ...
  • Ep1C_HeReT1c
  • Ep1C_HeReT1c
  • 2017-06-10 08:14:48
  • 318

BZOJ 4596: [Shoi2016]黑暗前的幻想乡 矩阵树定理 容斥原理

4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 429  Solved: 244 [Submit][S...
  • BlackJack_
  • BlackJack_
  • 2017-07-06 22:45:18
  • 175

bzoj 4596: [Shoi2016]黑暗前的幻想乡 (矩阵树定理+容斥原理)

题目描述传送门题目大意:n个点要修n-1条路(形成一棵树)。有n-1个公司,每个公司可以修建某些路径。求每个公司恰好修建一条路的方案数。题解生成树计数一般都是用基尔霍夫矩阵求行列式来做,关键是怎么解决...
  • clover_hxy
  • clover_hxy
  • 2017-03-24 07:36:52
  • 270
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 2120
    排名: 2万+
    最新评论