题目大意:给一张图,边有三种颜色,对于每一种可能的a+b+c=n-1的(a,b,c)问恰好a条红色边b条黄色c条蓝色边的方案数,n<=50,5s。
题解:朴素做法,红色视为x黄色视作y蓝色视作1跑矩阵树,直接做是O(n6)O(n^6)O(n6),代入x插值算y的多项式可以变成O(n5)O(n^5)O(n5),或者更直接的直接将状态压起来,即令y=xny=x^ny=xn,然后再代x插值即可。本题实现的时候要注意快速幂常数实际上极大,不能乱用。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define lint long long
#define mod 1000000007
#define gc getchar()
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define Rep(i,v) rep(i,0,(int)v.size()-1)
#define N 55
#define M (N*N*3)
#define K (N*N)
#define debug(x) cerr<<#x<<"="<<x
#define sp <<" "
#define ln <<endl
using namespace std;
inline int inn()
{int x,ch;while((ch=gc)<'0'||ch>'9');x=ch^'0';while((ch=gc)>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0');return x;
}
inline int fast_pow(int x,int k,int ans=1) { for(;k;k>>=1,x=(lint)x*x%mod) (k&1)?ans=(lint)ans*x%mod:0;return ans; }
inline int inv(int x) { return fast_pow(x,mod-2); }
inline int solve(int a[N][N],int n)
{int det=1;rep(i,1,n){int x=0;rep(j,i,n) if(a[j][i]) { x=j;break; }if(!x) return 0;if(x^i) det=(mod-det)%mod;swap(a[x],a[i]);int v=inv(a[i][i]);det=(lint)det*v%mod;rep(j,i,n) a[i][j]=(lint)a[i][j]*v%mod;rep(j,1,n) if(i^j) for(int k=n;k>=i;k--)a[j][k]-=(lint)a[j][i]*a[i][k]%mod,(a[j][k]<0?a[j][k]+=mod:0);}return det?inv(det):0;
}
int g[N][N],u[M],v[M],c[M],y[K],fac[K];
inline int getans(int x,int n,int m)
{rep(i,1,n) memset(g[i],0,sizeof(int)*(n+1));rep(i,1,m){int &a=g[u[i]][v[i]],&b=g[v[i]][u[i]],val;if(c[i]==1) val=fast_pow(x,n);else if(c[i]==2) val=x;else val=1;a+=val,b+=val,(a>=mod?a-=mod:0),(b>=mod?b-=mod:0);}rep(i,1,n) rep(j,1,n) if(i^j) g[i][i]+=g[i][j],(g[i][i]>=mod?g[i][i]-=mod:0);rep(i,1,n) rep(j,1,n) if(i^j) g[i][j]=(g[i][j]?mod-g[i][j]:0);return solve(g,n-1);
}
vector<int> tot,tmp,ans,res;
inline vector<int> tms(vector<int> x,int v)
{res.resize((int)x.size()+1),res[(int)x.size()]=0;Rep(i,x) res[i]=(lint)x[i]*v%mod;Rep(i,x) res[i+1]+=x[i],(res[i+1]>=mod?res[i+1]-=mod:0);return res;
}
inline vector<int> divd(vector<int> x,int v)
{int n=(int)x.size();res.resize(n-1);for(int i=n-1;i;i--)res[i-1]=x[i],x[i-1]-=(lint)v*x[i]%mod,(x[i-1]<0?x[i-1]+=mod:0);return res;
}
int main()
{int n=inn(),m=inn(),k=n*(n-1);rep(i,1,m) u[i]=inn(),v[i]=inn(),c[i]=inn();rep(i,1,k+1) y[i]=getans(i,n,m);tot.resize(1),tot[0]=1,ans.resize(k+1);rep(i,1,k+1) tot=tms(tot,mod-i);fac[0]=1;rep(i,1,k+1) fac[i]=(lint)fac[i-1]*i%mod;rep(i,1,k+1){y[i]=(lint)y[i]*inv((lint)fac[i-1]*fac[k+1-i]%mod)%mod;//dont use bf!That is too slow!if((k+1-i)%2==1) y[i]=(mod-y[i])%mod;tmp=divd(tot,mod-i);Rep(j,tmp) ans[j]+=(lint)tmp[j]*y[i]%mod,(ans[j]>=mod?ans[j]-=mod:0);}rep(i,0,n-1) rep(j,0,n-1-i) printf("%d\n",ans[i*n+j]);return 0;
}

五颜六色的幻想乡 - 矩阵树定理 - 拉格朗日插值相关推荐

  1. [XSY]Tree Ext(矩阵树定理,拉格朗日插值,最小生成树,二分)

    Tree Ext 这道题相当于把3道题合了起来. 要求修复的边中恰好有 k 条白边: 五颜六色的幻想乡(附拉格朗日插值法求多项式系数 ) + bzoj2654 tree(WQS二分 新科技get) 是 ...

  2. Wannafly挑战赛23F-计数【原根,矩阵树定理,拉格朗日插值】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/161/F 题目大意 给出nnn个点的一张图,求它的所有生成树中权值和为kkk的倍数的个数.输出答案对ppp取模 ...

  3. 【XSY1537】五颜六色的幻想乡 数学 生成树计数 拉格朗日插值

    题目大意 ​ 有一个\(n\)个点\(m\)条边的图,每条边有一种颜色\(c_i\in\{1,2,3\}\),求所有的包括\(i\)条颜色为\(1\)的边,\(j\)条颜色为\(2\)的边,\(k\) ...

  4. Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理,子集反演)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理) Problem n≤1 ...

  5. 【BZOJ4596】[Shoi2016]黑暗前的幻想乡 容斥+矩阵树定理

    [BZOJ4596][Shoi2016]黑暗前的幻想乡 Description 幽香上台以后,第一项措施就是要修建幻想乡的公路.幻想乡有 N 个城市,之间原来没有任何路.幽香向选民承诺要减税,所以她打 ...

  6. 【学习笔记】矩阵树定理(Matrix-Tree)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 一.矩阵树定理 二.常用定理 三.例题 1. Luogu P6178 [模板]Matrix-Tr ...

  7. 最小生成树、矩阵树定理、Prufer序列总结

    Kruskal算法 按边权排序,从小到大合并不在同一集合两点即可 Prim算法 每次加入一个到当前已选点集最近的点 P2619 [国家集训队]Tree I 考虑二分,每次给白边加上一个mid,通过这种 ...

  8. 幻想乡三连A:五颜六色的幻想乡

    非常直接地构造 由于答案与生成树计数有关,所以一定要使用矩阵树定理,但这样就不能限制每种颜色的便使用的数量 我们构造$N^2$个关于$Ans_{x,y}$的方程,枚举将红色的边拆成$x$条,将蓝色的边 ...

  9. 矩阵树定理2020HDU多校第6场j-Expectation[位运算+期望]

    矩阵树定理 用于求解图上面生成树的个数,生成树的个数等于基尔霍夫矩阵的任何一个N-1阶主子式的行列式的绝对值 矩阵树模板 struct Matrix_Tree {ll a[N][N];Matrix_T ...

最新文章

  1. JQuery -- this 和 $(this) 的区别
  2. 【专题】多角度深入解析开放原子开源基金会
  3. 韵乐x5效果器ktv最佳参数_家庭ktv(卡拉ok)家庭影院ktv选购推荐攻略
  4. linux 6.4 安装oracle10g,Red Hat Linux 6.4 安装 Oracle 10g 及问题解决
  5. 2021.5.23 中国高速列车运维技术讲座
  6. 2018 ACM-ICPC World Finals - Beijing F.Go with the Flow
  7. 8/7排位赛,codeforces501
  8. Python yield 的基本概念和用法
  9. uwsgi基础——参数
  10. 养生之道之一_吃喝相关[转载]
  11. android缅甸语,关于unicode:Android中的缅甸语言
  12. MitraStar DSL-2401HN-T1C-GV硬件与启动信息
  13. 签订房屋买卖居间合同后一方违约购房定金如何处理
  14. 第十二天-函数名 迭代器
  15. 小白应该如何选择国内服务器?腾讯云、阿里云、小鸟云?
  16. 运行中的Docker容器添加映射端口
  17. OneDrive,在云端
  18. u盘里的文件损坏了怎么修复?
  19. React+Redux技术栈核心要点解析(中篇)
  20. MySQL:关于排序order by limit值不稳定的说明(1)

热门文章

  1. java游戏2333整合包,[1.12.2][CatServer]基础插件简单MOD冰与火传说整合服务端
  2. 在低容错业务场景下落地微服务的实践经验
  3. 玩手机惹怒丈夫 男子用菜刀砍死怀孕8个月妻子
  4. 2020年9月大学英语六级作文
  5. 历时7天,四名学生将《水浒传》搬到线上!
  6. 关于一个简易的Html5音乐播放器的制作
  7. 做题记(4)P1080 国王游戏
  8. html中web字体图标,响应式Web图形篇 —— icon fonts(字体图标)在网页中的应用...
  9. 今天起,属于Windows 7的时代结束了...
  10. 计算并输出sin(x)、cos(x)、|x|、ex、xy的值