传送门

由于是边权三进制不进位的相加,那么可以考虑每一位的贡献

对于每一位,生成树的边权相当于是做模 \(3\) 意义下的加法

考虑最后每一种边权的生成树个数,这个可以直接用生成函数,在矩阵树求解的时候做一遍这个生成函数的模 \(3\) 意义下的循环卷积求出系数即可

暴力多项式运算不可取

考虑选取 \(3\) 个数字 \(x_i\),使得 \(x_i^3\equiv1(mod~10^9+7)\)

即找出 \(3\) 次单位复数根 \(\omega_3^0,\omega_3^1,\omega_3^2\)

这个直接带入三角表示法即可得到

把这些东西带入,矩阵树定理求出点值,最后手动 \(DFT^{-1}\) 即可

# include <bits/stdc++.h>
using namespace std;
typedef long long ll; const int mod(1e9 + 7);
const int inv2((mod + 1) >> 1);
const int inv3((mod + 1) / 3);
const int rt3(82062379); inline int Pow(ll x, int y) {
ll ret = 1;
for (; y; y >>= 1, x = x * x % mod)
if (y & 1) ret = ret * x % mod;
return ret;
} inline void Inc(int &x, int y) {
x = x + y >= mod ? x + y - mod : x + y;
} inline void Dec(int &x, int y) {
x = x - y < 0 ? x - y + mod : x - y;
} inline int Add(int x, int y) {
return x + y >= mod ? x + y - mod : x + y;
} inline int Sub(int x, int y) {
return x - y < 0 ? x - y + mod : x - y;
} struct Complex {
int a, b; inline Complex(int _a = 0, int _b = 0) {
a = _a, b = _b;
} inline Complex operator +(Complex y) const {
return Complex(Add(a, y.a), Add(b, y.b));
} inline Complex operator -(Complex y) const {
return Complex(Sub(a, y.a), Sub(b, y.b));
} inline Complex operator *(Complex y) const {
return Complex(Sub((ll)a * y.a % mod, (ll)b * y.b % mod), Add((ll)a * y.b % mod, (ll)b * y.a % mod));
} inline Complex operator *(int y) const {
return Complex((ll)a * y % mod, (ll)b * y % mod);
} inline Complex operator /(int y) const {
int inv = Pow(y, mod - 2);
return Complex((ll)a * inv % mod, (ll)b * inv % mod);
} inline Complex operator /(Complex y) const {
return Complex(a, b) * Complex(y.a, mod - y.b) / Add((ll)y.a * y.a % mod, (ll)y.b * y.b % mod);
}
} a[105][105], coef[3], inv, w[3], invw[3]; int n, m, eu[105 * 105], ev[105 * 105], ec[105 * 105], bin[20]; inline Complex Det() {
int i, j, k;
Complex ret = Complex(1, 0);
for (i = 1; i < n; ++i) {
for (j = i; j < n; ++j)
if (a[j][i].a || a[j][i].b) {
if (i == j) break;
swap(a[i], a[j]), ret = ret * (mod - 1);
break;
}
for (j = i + 1; j < n; ++j) {
inv = a[j][i] / a[i][i];
for (k = i; k < n; ++k) a[j][k] = a[j][k] - inv * a[i][k];
}
ret = ret * a[i][i];
}
return ret;
} inline void IDFT(Complex *p) {
int i;
Complex tmp[3];
tmp[0] = p[0], tmp[1] = p[1], tmp[2] = p[2];
p[0] = tmp[0] + tmp[1] + tmp[2];
p[1] = tmp[0] + tmp[1] * invw[1] + tmp[2] * invw[2];
p[2] = tmp[0] + tmp[1] * invw[2] + tmp[2] * invw[1];
for (i = 0; i < 3; ++i) p[i] = p[i] * inv3;
} inline int Calc(int p) {
int i, j, k;
Complex w0, w1, w2, c;
for (i = 0; i < 3; ++i) {
memset(a, 0, sizeof(a));
w0 = Complex(1, 0), w1 = w[i], w2 = w[(i + i) % 3];
for (j = 1; j <= m; ++j) {
k = ec[j] / bin[p] % 3;
c = (k == 1 ? w1 : (k == 2 ? w2 : w0));
a[eu[j]][eu[j]] = a[eu[j]][eu[j]] + c;
a[ev[j]][ev[j]] = a[ev[j]][ev[j]] + c;
a[eu[j]][ev[j]] = a[eu[j]][ev[j]] - c;
a[ev[j]][eu[j]] = a[ev[j]][eu[j]] - c;
}
coef[i] = Det();
}
IDFT(coef);
return (ll)Add(coef[1].a, Add(coef[2].a, coef[2].a)) * bin[p] % mod;
} int main() {
int i, ans = 0;
scanf("%d%d", &n, &m);
w[0] = Complex(1, 0), w[1] = Complex(mod - inv2, (ll)rt3 * inv2 % mod);
w[2] = Complex(mod - inv2, mod - (ll)rt3 * inv2 % mod);
invw[0] = Complex(1, 0) / w[0], invw[1] = Complex(1, 0) / w[1], invw[2] = Complex(1, 0) / w[2];
for (i = 1; i <= m; ++i) scanf("%d%d%d", &eu[i], &ev[i], &ec[i]);
for (bin[0] = i = 1; i <= 10; ++i) bin[i] = bin[i - 1] * 3;
for (i = 0; i <= 10; ++i) Inc(ans, Calc(i));
printf("%d\n", ans);
return 0;
}

LOJ#6271. 「长乐集训 2017 Day10」生成树求和 加强版的更多相关文章

  1. loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积)

    loj6271 「长乐集训 2017 Day10」生成树求和 加强版(矩阵树定理,循环卷积) loj 题解时间 首先想到先分开三进制下每一位,然后每一位分别求结果为0,1,2的树的个数. 然后考虑矩阵 ...

  2. loj6271「长乐集训 2017 Day10」生成树求和 加强版

    又是一个矩阵树套多项式的好题. 这里我们可以对每一位单独做矩阵树,但是矩阵树求的是边权积的和,而这里我们是要求加法,于是我们i将加法转化为多项式的乘法,其实这里相当于一个生成函数?之后如果我们暴力做的 ...

  3. 「长乐集训 2017 Day10」划分序列 (二分 dp)

    「长乐集训 2017 Day10」划分序列 题目描述 给定一个长度为 n nn 的序列 Ai A_iA​i​​,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一 ...

  4. 「长乐集训 2017 Day1」区间 线段树

    题目 对于两个区间\((a,b),(c,d)\),若\(c < a < d\)或\(c < b < d\)则可以从\((a,b)\)走到\((c,d)\)去,现在有以下两种操作 ...

  5. 「长乐集训 2017 Day8」修路 (斯坦纳树)

    题目描述 村子间的小路年久失修,为了保障村子之间的往来,AAA君决定带领大家修路. 村子可以看做是一个边带权的无向图GGG, GGG 由 nnn 个点与 mmm 条边组成,图中的点从 1∼n1 \si ...

  6. Loj #2331. 「清华集训 2017」某位歌姬的故事

    Loj #2331. 「清华集训 2017」某位歌姬的故事 IA 是一名会唱歌的女孩子. IOI2018 就要来了,IA 决定给参赛选手们写一首歌,以表达美好的祝愿.这首歌一共有 \(n\) 个音符, ...

  7. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  8. Loj #2321. 「清华集训 2017」无限之环

    Loj #2321. 「清华集训 2017」无限之环 曾经有一款流行的游戏,叫做 *Infinity Loop***,先来简单的介绍一下这个游戏: 游戏在一个 \(n \times m\) 的网格状棋 ...

  9. Loj 2320.「清华集训 2017」生成树计数

    Loj 2320.「清华集训 2017」生成树计数 题目描述 在一个 \(s\) 个点的图中,存在 \(s-n\) 条边,使图中形成了 \(n\) 个连通块,第 \(i\) 个连通块中有 \(a_i\ ...

随机推荐

  1. vue 学前班002(创建一个实例)

    创建一个Vue实例 我们之前说过,Vue是数据驱动视图的,只要model(模型层)的数据改变了,Vue就会帮我们改变视图上显示的内容,不用我们自己去动手写代码更新.那么,它是怎么做到的,我们的代码要怎 ...

  2. jvm内存结构(二)(栈的变化,机器指令的格式/执行模式)

    栈的结构: <Java虚拟机原理图解>4.JVM机器指令集 局部变量表: 方法执行时,虚拟机会把字节码中方法数据区的code类型的属性中的局部变量放到栈的局部变量表中. 操作栈: jvm指 ...

  3. 在VMware 14中安装Centos7

    在VMware 14中安装Centos7 一.安装前准备 安装VMware14.1 Centos7 64位镜像下载 在VMware中安装Centos7的步骤为: 1.创建虚拟机 创建虚拟机有两种方式: ...

  4. node 本地静态服务器

    直接上代码 const connect = require("connect"); const serveStatic = require("serve-static&q ...

  5. 多项式求逆元详解+模板 【洛谷P4238】多项式求逆

    概述 多项式求逆元是一个非常重要的知识点,许多多项式操作都需要用到该算法,包括多项式取模,除法,开跟,求ln,求exp,快速幂.用快速傅里叶变换和倍增法可以在$O(n log n)$的时间复杂度下求出 ...

  6. jq02--基础函数

    jq是一个js函数库,主要是为事件处理特别设计的,现在我们继续学习一些jq函数. 1.jq效果: 显示与隐藏: $().hide(speed,callback) speed--"slow&q ...

  7. 去掉iphone上拨号弹出框

    1.常规的方法可以直接去除默认事件event.preventDefault() 2.使用vue的话可以: <div @click.stop.prevent=</div> //或者 & ...

  8. An assembly specified in the application dependencies manifest

    .Net Core 运行的时候报错 An assembly specified in the application dependencies manifest (xxx.deps.json) was ...

  9. android开发分辨率适配总结

    重要概念 什么是屏幕尺寸.屏幕分辨率.屏幕像素密度? 什么是dp.dip.dpi.sp.px?他们之间的关系是什么? 什么是mdpi.hdpi.xdpi.xxdpi?如何计算和区分? 在下面的内容中我 ...

  10. spring boot整合RabbitMQ(Direct模式)

    springboot集成RabbitMQ非常简单,如果只是简单的使用配置非常少,springboot提供了spring-boot-starter-amqp项目对消息各种支持. Direct Excha ...