正题

题目链接:https://ac.nowcoder.com/acm/contest/161/F


题目大意

给出nnn个点的一张图,求它的所有生成树中权值和为kkk的倍数的个数。输出答案对ppp取模
1≤n,k≤100,1≤m≤104,p∈[2,109]∩Pri1\leq n,k\leq 100,1\leq m\leq 10^4,p\in[2,10^9]\cap Pri1≤n,k≤100,1≤m≤104,p∈[2,109]∩Pri
数据保证k≡1(modp)k\equiv 1(mod\ p)k≡1(mod p)


解题思路

一个想法是把一条边权看做xwx^wxw的多项式,用矩阵树定理乘起来后kkk的倍数的系数和就是答案。
但是这样系数是nknknk个,显然搞不定。

类似于CF917D-StrangerTree的做法我们可以带入若干个值然后跑矩阵数之后求出若干个点值。

但是这里是kkk的倍数,我们要模拟卷积,可以带入kkk个ggg满足gk=1g^k=1gk=1的就可以了。

这里保证了k≡1(modp)k\equiv 1(mod\ p)k≡1(mod p),所以我们求出ppp的原根ggg然后带入gp−1k×i(i∈[0,k−1])g^{\frac{p-1}{k}\times i}(i\in[0,k-1])gkp−1​×i(i∈[0,k−1])就可以了。

然后直接拉插求出x=0x=0x=0的点值就好了。

时间复杂度O(n3k)O(n^3k)O(n3k)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll N=110;
struct node{ll x,y,w;
}e[N*N];
ll n,m,k,P,g,x[N],y[N];
vector<ll> p;
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void Prime(){ll x=P-1;for(ll i=2;i*i<=x;i++)if(x%i==0){p.push_back(i);while(x%i==0)x/=i;}if(x>1)p.push_back(x);
}
bool check(ll x){for(ll i=0;i<p.size();i++)if(power(x,(P-1)/p[i])==1)return 0;return 1;
}
namespace Matrix{ll a[N][N];ll det(ll v){memset(a,0,sizeof(a));ll ans=1;for(ll i=1;i<=m;i++){ll x=e[i].x,y=e[i].y,w=power(v,e[i].w); (a[x][y]+=P-w)%=P;(a[y][x]+=P-w)%=P;(a[x][x]+=w)%=P;(a[y][y]+=w)%=P;}ll f=0;for(ll i=1;i<n;i++){for(ll j=i;j<n;j++)if(a[j][i]){if(i==j)break;swap(a[i],a[j]);f^=1;break;}ans=ans*a[i][i]%P;ll inv=power(a[i][i],P-2);for(ll j=i;j<n;j++)a[i][j]=a[i][j]*inv%P;for(ll j=i+1;j<n;j++){ll rate=P-a[j][i];for(ll k=i;k<n;k++)(a[j][k]+=rate*a[i][k])%=P;}}return f?(P-ans):ans;}
}
signed main()
{scanf("%lld%lld%lld%lld",&n,&m,&k,&P);Prime();g=1;while(!check(g))g++;for(ll i=1;i<=m;i++)scanf("%lld%lld%lld",&e[i].x,&e[i].y,&e[i].w);for(ll i=1;i<=k;i++){x[i]=power(g,(P-1)/k*(i-1));y[i]=Matrix::det(x[i]);}ll ans=0;for(ll i=1;i<=k;i++){ll tmp=1;for(ll j=1;j<=k;j++)if(i!=j)tmp=tmp*(P-x[j])%P*power(x[i]-x[j],P-2)%P;(ans+=tmp*y[i]%P)%=P;}printf("%lld\n",(ans+P)%P);return 0;
}

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

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

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

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

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

  3. BZOJ1016 || 洛谷P4208 [JSOI2008]最小生成树计数【矩阵树定理】

    时空限制 1000ms / 128MB 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则 ...

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

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

  5. 图论数学:矩阵树定理

    运用矩阵树定理进行生成树计数 给定一个n个点m条边的无向图,问生成树有多少种可能 直接套用矩阵树定理计算即可 矩阵树定理的描述如下: 首先读入无向图的邻接矩阵,u-v G[u][v]++ G[v][u ...

  6. CSU 1805 Three Capitals(矩阵树定理+Best定理)

    http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1805 题意: A和B之间有a条边,A和G之间有b条边,B和G之间有c条边.现在从A点出发走遍所 ...

  7. 基尔霍夫(kirchhoff)矩阵树定理

    引入问题   给n个点m条边的图,求该图的最小生成树个数. 定理内容   我们对这个图构造两个矩阵,分别是这个图的连通矩阵和度数矩阵.连通矩阵S1S1S1的第iii行第jjj列上的数字表示原无向图中编 ...

  8. [P4455][CQOI2018]社交网络(矩阵树定理)

    关于矩阵树定理用于有向图生成树计数: ①内向树生成树计数.  A为邻接矩阵, D为出度矩阵.  C=D−A.  以root为根的内向生成树个数为C的余子式M[root,root]的行列式.  ②外向树 ...

  9. 行列式入门与矩阵树定理完整证明

    文章目录 前置技能 行列式 定义 性质 拉普拉斯展开 线性性 可乘性 可加性 不重性 可倍加性 转置不变性 可交换性 行可交换性 列可交换性 优化行列式的计算 矩阵树定理 前置定义 一些引理 转置引理 ...

最新文章

  1. MySQL服务器的构建与维护
  2. 敏感词库 php,敏感词过滤的php类库
  3. 设计模式-创建型-单件
  4. [BZOJ1643][Usaco2007 Oct]Bessie's Secret Pasture 贝茜的秘密草坪
  5. echarts画中国地图!
  6. JS版日期格式化和解析工具类
  7. G - 取石子游戏 HDU - 2516 (斐波那契博弈)
  8. JavaWeb项目分层结构
  9. [Unity算法]斜抛运动
  10. 人均劳动生产率的计算方法_劳动生产率计算公式
  11. 【帝国CMS】灵动标签SQL调用广告系统里的广告
  12. 如何在windows11系统中打开ie11浏览网页
  13. 计算机网络dna,DNA计算
  14. php word 开发指南大全 点击目录查看所有功能
  15. 用BitBlt实现透明贴图
  16. [ROC-RK3568-PC] 手把手教你把出厂的Android系统烧写为Ubuntu系统
  17. seo + sem 的竞价推广 如何操作基础一(网络营销)
  18. 独热编码-通过python代码讲解
  19. 【洛谷 P1240】诸侯安置
  20. 大数据离线流程(小练习二)

热门文章

  1. 获取 子文件夹 后缀_CSDN学院第一个Ptython Homework-- 递归统计文件夹大小
  2. java中有stdin_在java中听stdin的后台进程
  3. 让对话框不显示边框_微信消息“无边框”模式搭配这款壁纸,简直绝了
  4. 移动计算机怎么开机密码,win7忘记开机密码解决办法
  5. html li 做瀑布流,js实现瀑布流效果(自动生成新的内容)
  6. 查询程序崩溃日志_PC 崩溃报告途径 amp; 临时解决方法
  7. oracle拆分分区语法详解大全_Oracle hash的分区方法详解
  8. php里面电话验证码,PHP的中问验证码
  9. 机器学习案例——生态系统蒸散速率预测
  10. csdn上修改字体的颜色