题目大意

​  有一个\(n\)个点\(m\)条边的图,每条边有一种颜色\(c_i\in\{1,2,3\}\),求所有的包括\(i\)条颜色为\(1\)的边,\(j\)条颜色为\(2\)的边,\(k\)条颜色为\(3\)的边的生成树的数量。

​  对\({10}^9+7\)取模。

​  \(n\leq 50\)

题解

​  如果\(\forall i,c_i=1\),就可以直接用基尔霍夫矩阵计算生成树个数。但是现在有三种颜色,不妨设\(c_i=2\)的边的边权为\(x\),\(c_i=3\)的边的边权为\(y\)。因为\(x\)的次数不会超过\(n-1\),所以可以设\(y=x^n\)。基尔霍夫矩阵可能是这样子的:

​ \[\begin{bmatrix}1+x&-1&-x\\-1&1+x^n&-x^n\\-x&-x^n&x^{n+1}\end{bmatrix}\]

​  这样的话直接高斯消元很明显会TLE,可以用FFT优化。FFT是在每次乘法时先做一次求值,做一次点值乘法,最后做一次插值。所以我们可以先在消元前做一次求值,消元时直接做点值乘法,最后再插值插回来。

​  因为答案的最高次不超过\(n(n-1)\),所以我们可以把\(n(n-1)+1\)个点带到行列式中,把每次得到的行列式保存下来,最后再用拉格朗日插值插回来。这里不能用高斯消元是因为高斯消元会直接TLE。

​  求行列式的总时间复杂度是\(O(n^2)\times O(n^3)=O(n^5)\),拉格朗日插值的时间复杂度是\(O({(n^2)}^2)=O(n^4)\),高斯消元的时间复杂度是\(O({(n^2)}^3)=O(n^6)\)。

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
ll p=1000000007;
ll a[60][60];
int lx[10010];
int ly[10010];
int lc[10010];
ll x[3010];
ll y[3010];
ll c[3010];
ll b[3010];
ll d[3010];
ll l[3010];
ll ans[3010];
ll fp(ll a,ll b)
{ll s=1;while(b){if(b&1)s=s*a%p;a=a*a%p;b>>=1;}return s;
}
ll calc(int t)
{int i,j,k;ll s=1;for(i=1;i<=t;i++){for(j=i;j<=t;j++)if(a[j][i])break;if(j>t)return 0;int x=j;if(x>i){s=-s;for(j=i;j<=t;j++)swap(a[i][j],a[x][j]);}for(j=i+1;j<=t;j++)if(a[j][i]){ll d=a[j][i]*fp(a[i][i],p-2)%p;for(k=i;k<=t;k++)a[j][k]=(a[j][k]-a[i][k]*d%p)%p;}}for(i=1;i<=t;i++)s=s*a[i][i]%p;s=(s+p)%p;return s;
}
int main()
{
//  freopen("count.in","r",stdin);int n,m;scanf("%d%d",&n,&m);int i,j,k;for(i=1;i<=m;i++)scanf("%d%d%d",&lx[i],&ly[i],&lc[i]);for(i=1;i<=n*n;i++){x[i]=(i*1000+1)%p;
//      x[i]=i%p;ll px=fp(x[i],n);memset(a,0,sizeof a);for(j=1;j<=m;j++){if(lc[j]==1){a[lx[j]][lx[j]]++;a[ly[j]][ly[j]]++;a[lx[j]][ly[j]]--;a[ly[j]][lx[j]]--;}else if(lc[j]==2){(a[lx[j]][lx[j]]+=x[i])%=p;(a[ly[j]][ly[j]]+=x[i])%=p;(a[lx[j]][ly[j]]-=x[i])%=p;(a[ly[j]][lx[j]]-=x[i])%=p;}else{(a[lx[j]][lx[j]]+=px)%=p;(a[ly[j]][ly[j]]+=px)%=p;(a[lx[j]][ly[j]]-=px)%=p;(a[ly[j]][lx[j]]-=px)%=p;}}y[i]=calc(n-1);}int t=n*n;memset(c,0,sizeof c);c[0]=1;memset(ans,0,sizeof ans);for(i=1;i<=t;i++)for(j=t;j>=0;j--){(c[j+1]+=c[j])%=p;(c[j]=-c[j]*x[i])%=p;}for(i=1;i<=t;i++){memcpy(d,c,sizeof d);memset(b,0,sizeof b);for(j=t;j>=0;j--){b[j]=d[j+1];d[j]=(d[j]+d[j+1]*x[i])%p;d[j+1]=0;}ll s=0,px=1;for(j=0;j<=t;j++){s=(s+px*b[j])%p;px=px*x[i]%p;}s=fp(s,p-2)*y[i]%p;for(j=0;j<=t;j++)b[j]=b[j]*s%p;for(j=0;j<=t;j++)ans[j]=(ans[j]+b[j])%p;}for(i=0;i<n;i++)for(j=0;j<n-i;j++)printf("%lld\n",(ans[j+n*(n-i-j-1)]%p+p)%p);return 0;
}

转载于:https://www.cnblogs.com/ywwyww/p/8511158.html

【XSY1537】五颜六色的幻想乡 数学 生成树计数 拉格朗日插值相关推荐

  1. 五颜六色的幻想乡 - 矩阵树定理 - 拉格朗日插值

    题目大意:给一张图,边有三种颜色,对于每一种可能的a+b+c=n-1的(a,b,c)问恰好a条红色边b条黄色c条蓝色边的方案数,n<=50,5s. 题解:朴素做法,红色视为x黄色视作y蓝色视作1 ...

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

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

  3. 【ybt金牌导航8-3-3】【luogu P4593】分数计算 / 教科书般的亵渎(数学)(拉格朗日插值)

    分数计算 / 教科书般的亵渎 题目链接:ybt金牌导航8-3-3 / luogu P4593 题目大意 有一些怪,血量从 1~n,其中有 m 个数是没有怪的,给出这些数. 然后你可以每次操作攻击所有怪 ...

  4. html5--canvas--众神眷恋的幻想乡(STG)

    一个小游戏,也花了点功夫,稍微记录一下过程,也可以理解为是对我代码的一个解释.主要用HTML5的canvas的一些API,早就想模仿东方project系列弹幕游戏写一个了,但以前学C/C++时嫌win ...

  5. [bzoj4596][矩阵树][容斥]黑暗前的幻想乡

    4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 565 Solved: 328 [Submit][Sta ...

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

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

  7. [ZJOI2015]醉熏熏的幻想乡

    醉熏熏的幻想乡 题解 相当阴间的一道题 首先如果只用解决第一小问的话,我们很容易想到通过网络流来求最大流的. 但是我们现在还要保证总费用最小呀,这该怎么办?拆成许多个点费用流,不TTT才怪. 我们假设 ...

  8. [BZOJ4596][Shoi2016]黑暗前的幻想乡-Matrix Tree 矩阵树定理

    黑暗前的幻想乡 Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类)博丽灵梦和八云紫等人整日 ...

  9. [Zjoi2015]诸神眷顾的幻想乡

    [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 1537  Solved: 892 Description 幽香 ...

最新文章

  1. MySQL字符编码设置
  2. 小学生学python到底能干什么-小学生都学Python了,你还没用万矿?
  3. 软件回归测试及其实践
  4. ZooKeeper编程
  5. datagridview绑定与详细说明 (搜集)
  6. dj电商-需求分析开始-静态资源-用户模块
  7. python php multiprocessing,Python多进程并发(multiprocessing)用法实例详解
  8. 机器学习基础(二)——词集模型(SOW)和词袋模型(BOW)
  9. 【IT历史】SP和CP
  10. cat6 万兆_专业扫盲Cat5e/Cat6/Cat6a/Cat7网线系列
  11. 解决mac按键精灵鼠标位置不准(连点器)
  12. 简单易上手的MMD-Ray渲基础教程
  13. 排序算法(三)—— 插入法排序算法
  14. html圆角半径,CSS3 / 绘制四个角不同半径的圆角边框 - 汇智网
  15. Win7系统怎么获取administrator权限?获取administrator权限的方法
  16. utools01-分享一个极简的多功能高效率工作神器
  17. mysql8安装成功后忘记密码,密码重置
  18. python复习。知识点小记
  19. Pytorch实现mnist手写数字识别
  20. 【转】为什么程序猿996多猝屎,而企业家007却不会?

热门文章

  1. android 代码等待一秒,【报Bug】安卓微信旧版本7.0.2 ,支付完成,等待几秒后,再点击完成 回到小程序,跳转不了页面。...
  2. 2019年第四季度书单
  3. PHP mbstrpos,php中strpos函数与mb_strpos函数的区别
  4. 第19组 Beta(1/3)
  5. [POI2011]SEJ-Strongbox
  6. 文本字段的html标签是什么,HTML常用标签及属性
  7. 面试官:RocketMQ是什么,它有什么特性与使用场景?
  8. 系统自带扑克牌资源动态链接库cards.dll逆向分析笔记
  9. ssh-agent 详解
  10. bochs安装以及使用