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

非常直接地构造
由于答案与生成树计数有关,所以一定要使用矩阵树定理,但这样就不能限制每种颜色的便使用的数量
我们构造$N^2$个关于$Ans_{x,y}$的方程,枚举将红色的边拆成$x$条,将蓝色的边拆成$y$条,跑一遍矩阵树定理,就得到$$G_{x,y}=\sum\limits_{i=0}^{n-1} \sum\limits_{j=0}^{n-i-1} Ans_{i,j}\cdot x^i\cdot y^j$$然后会发现$Ans_{i,j}$可以看做这个二维多项式的系数,直接用拉格朗日插值构造得解。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define mod 1000000007
#define M 60
using namespace std;
int read(){
int nm=0,fh=1; char cw=getchar();
for(;!isdigit(cw);cw=getchar()) if(cw=='-') fh=-fh;
for(;isdigit(cw);cw=getchar()) nm=nm*10+(cw-'0');
return nm*fh;
}
int n,m,u[M*M],v[M*M],kd[M*M],mat[M][M],T[M][M],ans[M][M];
int X[M],Y[M],tmp,V[M][M];
int add(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
int mus(int x,int y){return (x-y)<0?x-y+mod:x-y;}
int mul(int x,int y){return (LL)x*(LL)y%mod;}
void upd(int &x,int y){x=add(x,y);}
int qpow(int x,int sq){
int res=1;
while(sq){if(sq&1) res=mul(res,x);x=mul(x,x),sq>>=1;}
return res;
}
int init(int x,int y){
const int w[4]={0,x,y,1};
int dt,inv,now=1,ot;
memset(mat,0,sizeof(mat));
for(int i=1;i<=m;i++){
upd(mat[u[i]][v[i]],mod-w[kd[i]]),upd(mat[u[i]][u[i]],w[kd[i]]);
upd(mat[v[i]][u[i]],mod-w[kd[i]]),upd(mat[v[i]][v[i]],w[kd[i]]);
}
for(int i=1;i<n;i++){
for(ot=i;ot<n&&mat[ot][i]==0;ot++);
if(ot>=n) return 0;
if(ot!=i){now=mod-now;for(int j=i;j<n;j++) swap(mat[i][j],mat[ot][j]);}
now=mul(now,mat[i][i]),inv=qpow(mat[i][i],mod-2);
for(int j=i+1;j<n;j++){
if(!mat[j][i]) continue; dt=mul(mat[j][i],inv);
for(int k=i;k<n;k++) mat[j][k]=mus(mat[j][k],mul(dt,mat[i][k]));
}
}
return now;
}
void solve(int x,int y){
memset(X,0,sizeof(X)),X[0]=1;
memset(Y,0,sizeof(Y)),Y[0]=1;
tmp=T[x][y];
for(int i=1;i<=n;i++){
if(i!=x){
for(int j=i;j;j--) X[j]=mus(X[j-1],mul(X[j],i));
X[0]=mul(X[0],mod-i),tmp=mul(tmp,V[x][i]);
}
if(i!=y){
for(int j=i;j;j--) Y[j]=mus(Y[j-1],mul(Y[j],i));
Y[0]=mul(Y[0],mod-i),tmp=mul(tmp,V[y][i]);
}
}
for(int i=0;i<n;i++) for(int j=0;j+i<n;j++) upd(ans[i][j],mul(tmp,mul(X[i],Y[j])));
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++) u[i]=read(),v[i]=read(),kd[i]=read();
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) T[i][j]=init(i,j);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) V[i][j]=qpow(mus(i,j),mod-2);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) solve(i,j);
for(int i=0;i<n;i++) for(int j=0;i+j<n;j++) printf("%d\n",ans[i][j]);
return 0;
}
幻想乡三连A:五颜六色的幻想乡的更多相关文章
- 【XSY1537】五颜六色的幻想乡 数学 生成树计数 拉格朗日插值
题目大意 有一个\(n\)个点\(m\)条边的图,每条边有一种颜色\(c_i\in\{1,2,3\}\),求所有的包括\(i\)条颜色为\(1\)的边,\(j\)条颜色为\(2\)的边,\(k\) ...
- 幻想乡三连B:连在一起的幻想乡
$G[k][x]$表示所有$x$个点的无向图中每一个图的边数的$k$次方之和. $F[k][x]$就是在$G[k][x]$的基础上加了一个整体连通的性质. 有一个经典的套路就是对于$F$在对应的$G$ ...
- 幻想乡三连C:狂飙突进的幻想乡
题解: 不难发现,对于每一条从$S$到$T$的路径,设其$x.y$的和为$S_x.S_y$,其对答案的贡献是$a\cdot S_x+(1-a)\cdot S_y$,这是一个关于$a$的一次函数.而所有 ...
- 线段树合并+并查集 || BZOJ 2733: [HNOI2012]永无乡 || Luogu P3224 [HNOI2012]永无乡
题面:P3224 [HNOI2012]永无乡 题解: 随便写写 代码: #include<cstdio> #include<cstring> #include<iostr ...
- BZOJ4596: [Shoi2016]黑暗前的幻想乡
Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...
- bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 559 Solved: 325[Submit][Sta ...
- [SHOI2016]黑暗前的幻想乡
Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...
- bzoj4596[Shoi2016]黑暗前的幻想乡 Matrix定理+容斥原理
4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 464 Solved: 264[Submit][Sta ...
- [ZJOI2016]小星星&[SHOI2016]黑暗前的幻想乡(容斥)
这两道题思路比较像,所以把他们放到一块. [ZJOI2016]小星星 题目描述 小Y是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有n颗小星星,用m条彩色的细线串了起来,每条细线连着两颗小星星. ...
随机推荐
- Lumen开发:lumen源码解读之初始化(2)——门面(Facades)与数据库(db)
版权声明:本文为博主原创文章,未经博主允许不得转载. 紧接上一篇 $app->withFacades();//为应用程序注册门面. $app->withEloquent();//为应用程序 ...
- [学英语]vocabulary.com你都可以怎么用
vocabulary.com你都可以怎么用? 核心就是背单词. 1.利用纯英文环境熟悉单词,看看他们是如何解释单词的. 2.对于大段的文章,可以提炼出你需要背的单词. 3.以游戏的方式来背单词,app ...
- 基于SpringMVC国际化资源配置方式
1.首先需要在spring-mvc-servlet.xml 中配置拦截器: <bean id="localeChangeInterceptor" class="or ...
- Django 动态导入配置文件的类
导入配置文件的类 #如何用字符串的形式动态导入模块 from importlib import import_module path=''api.cors.CORSMiddleware' #CORSM ...
- threading.local的作用?
threading.local()这个方法的特点用来保存一个全局变量,但是这个全局变量只有在当前线程才能访问,如果你在开发多线程应用的时候 需要每个线程保存一个单独的数据供当前线程操作,可以考虑使用 ...
- goland中引用包
首先在工程目录下新建三个目录:bin, pkg,src Bin文件夹是放置编译后的exe文件 Pkg文件夹是放置包生成后的.a文件 Src文件夹是放置包文件的地方 工程组织目录如下,在src中有tes ...
- 如何从统计中批量获取BD搜索关键词及对应的入口页面?
前面我们介绍了通过cnzz的访问明细获取到搜索关键词及对应的入口页面,但是从BD搜索进来的关键词无法完整显示,只能呈现一些bd图片搜索的关键词,这是因为百度宣布从去年5月开始逐渐取消了referer关 ...
- Computer Vision: Algorithms and ApplicationsのImage processing
实在是太喜欢Richard Szeliski的这本书了.每一章节(after chapter3)都详述了该研究方向比較新的成果.还有很多很多的reference,假设你感兴趣.全然能够看那些參考论文 ...
- activiti 基础搭建
首先在eclipse内添加activiti的插件,https://blog.csdn.net/qq_22701869/article/details/79537971 1.创建一个maven的java ...
- SAP basis 常用事物
1.创建一个新的用户 完成client创建和拷贝后,在开始正式工作之前,需要创建新的用户. 用这个用户进行工作.默认ddic和sap*用户不要用于实际的业务. 创建用户的过程很简单,只要以su01 ...