正题

题目链接:https://www.ybtoj.com.cn/problem/893


题目大意

给出一张nnn个点mmm条边的无向联通图,每条边正反向各有A,B,CA,B,CA,B,C三种边权。
保证满足
Ax,y=−Ay,x,Bx,y=By,x,Cx,y=−Cy,xA_{x,y}=-A_{y,x}\ ,\ B_{x,y}=B_{y,x}\ ,\ C_{x,y}=-C_{y,x}Ax,y​=−Ay,x​ , Bx,y​=By,x​ , Cx,y​=−Cy,x​
∑x−>yCx,y=0\sum_{x->y}C_{x,y}=0x−>y∑​Cx,y​=0
且对于每个环[v1,v2...vn](v1=vn)[v_1,v_2...v_n](v_1=v_n)[v1​,v2​...vn​](v1​=vn​)
∑i=1n−1Cvi,vi+1×Bvi,vi+1=∑i=1n−1Avi,vi+1\sum_{i=1}^{n-1}C_{v_i,v_{i+1}}\times B_{v_i,v_{i+1}}=\sum_{i=1}^{n-1}A_{v_i,v_{i+1}}i=1∑n−1​Cvi​,vi+1​​×Bvi​,vi+1​​=i=1∑n−1​Avi​,vi+1​​

现在给你A,BA,BA,B边权,求CCC边权。

数据保证解唯一,所有限制都在模PPP意义下

n∈[1,100],m∈[1,2000],P∈[1,1018]∪Prin\in[1,100],m\in[1,2000],P\in[1,10^{18}]\cup Prin∈[1,100],m∈[1,2000],P∈[1,1018]∪Pri


解题思路

最后一个环的限制很麻烦,因为环很多。

先考虑原图的任意一颗生成树TTT上,对于任意一条非树边(u,v)(u,v)(u,v)可以表示一个u−>v−>uu->v->uu−>v−>u的环。并且因为反过来走边权为负,所以你可以通过用一些小环相互抵消出一个大环。

结论就是所有的环都可以被一些用非树边表示的环相互抵消表示。所以我们就可以将环的数量减少到O(m)O(m)O(m)级别了。

暴力消元O(m3)O(m^3)O(m3)显然无法通过本题,我们还需要优化。

设Dx,y=Bx,y×Cx,y−Ax,yD_{x,y}=B_{x,y}\times C_{x,y}-A_{x,y}Dx,y​=Bx,y​×Cx,y​−Ax,y​,那么第一个条件就表示成了每个环DDD的和为000。

并且还能发现一个性质,对于一个非树边表示的环(x,y)(x,y)(x,y),
path(y,x)+Dx,y=0,path(x,y)=−path(y,x),⇒Dx,y=path(x,y)path(y,x)+D_{x,y}=0,path(x,y)=-path(y,x),\Rightarrow D_{x,y}=path(x,y)path(y,x)+Dx,y​=0,path(x,y)=−path(y,x),⇒Dx,y​=path(x,y)
(其中path(x,y)path(x,y)path(x,y)表示树上路径x,yx,yx,y的DDD值和)

所以可以证明从xxx走到yyy的所有路径权值相同

那么我们可以设fx=path(1,x)f_x=path(1,x)fx​=path(1,x),那么Dx,y=fy−fxD_{x,y}=f_y-f_xDx,y​=fy​−fx​。

这样对于每个点就可以根据CCC的限制列出一个方程
∑x−>yfy−fx+Ax,yBx,y=0\sum_{x->y}\frac{f_y-f_x+A_{x,y}}{B_{x,y}}=0x−>y∑​Bx,y​fy​−fx​+Ax,y​​=0

然后高斯消元即可,时间复杂度O(n3)O(n^3)O(n3)

注意模数比较大,要写龟速乘


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=110;
struct node{ll x,y,a,b;
}e[N*20];
ll n,m,P,f[N];
ll mul(ll a,ll b){a%=P;b%=P;ll tmp=(long double)a*b/P;long double ans=a*b-tmp*P;if(ans>=P)ans-=P;else if(ans<0)ans+=P;return ans;
}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=mul(ans,x);x=mul(x,x);b>>=1; }return ans;
}
namespace G{ll a[N][N],b[N];void solve(ll *f){for(ll i=1;i<=n;i++){ll p=i;for(ll j=i;j<=n;j++)if(a[j][i]){p=j;break;}swap(a[i],a[p]);swap(b[i],b[p]);ll inv=power(a[i][i],P-2);b[i]=mul(b[i],inv);for(ll j=i;j<=n;j++)a[i][j]=mul(a[i][j],inv);for(ll j=i+1;j<=n;j++){ll rate=P-a[j][i];for(ll k=i;k<=n;k++)a[j][k]=(a[j][k]+mul(rate,a[i][k]))%P;b[j]=(b[j]+mul(rate,b[i]))%P;}}for(ll i=n;i>=1;i--){for(ll j=i+1;j<=n;j++)(b[i]+=P-mul(b[j],a[i][j]))%=P;f[i]=b[i];}return;}
}
signed main()
{freopen("graph.in","r",stdin);freopen("graph.out","w",stdout);scanf("%lld%lld%lld",&n,&m,&P);for(ll i=1;i<=m;i++)scanf("%lld%lld%lld%lld",&e[i].x,&e[i].y,&e[i].a,&e[i].b);for(ll i=1;i<=m;i++){ll x=e[i].x,y=e[i].y,a=e[i].a,b=e[i].b;b=power(b,P-2);(G::a[x][y]+=b)%=P;(G::a[x][x]+=P-b)%=P;(G::b[x]+=P-mul(a,b))%=P;swap(x,y);a=P-a;(G::a[x][y]+=b)%=P;(G::a[x][x]+=P-b)%=P;(G::b[x]+=P-mul(a,b))%=P;}for(ll i=1;i<=n;i++)G::a[1][i]=0;G::a[1][1]=1;G::b[1]=0;G::solve(f);for(ll i=1;i<=m;i++){ll x=e[i].x,y=e[i].y,a=e[i].a,b=e[i].b;b=power(b,P-2);printf("%lld\n",mul((f[y]-f[x]+a+P)%P,b));}return 0;
}

YbtOJ#893-带权的图【高斯消元,结论】相关推荐

  1. 【期望】【高斯消元】图上游走(金牌导航 期望-6)

    图上游走 金牌导航 期望-6 题目大意 给出一个无向连通图,小明初始在点1,每一步等概率地走向相连的其他点,当走到n时结束,定义分数从1为走到n的过程中经过的边的编号之和,现在让你给这m条边重新编号, ...

  2. Rocksdb Ribbon Filter : 结合 XOR-filter 以及 高斯消元算法 实现的 高效filter

    文章目录 前言 XOR-filter 实现原理 xor filter 的构造原理 xor filter 构造总结 XOR-filter 和 ADD-filter对比 XOR-filter 在计算上的优 ...

  3. 【BZOJ2115】[Wc2011] Xor 高斯消元求线性基+DFS

    [BZOJ2115][Wc2011] Xor Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ...

  4. 高斯消元简单线性代数线性基学习记录

    线性代数,唉 高斯消元 P4035 [JSOI2008]球形空间产生器 题目描述 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标 ...

  5. 解线性方程组——高斯消元の板子

    ATP记得它在很久以前看过一点点高斯消元的东西然后做过一点点题目..但是当时实在是太zz了所以本来就没有很懂这个东西现在更是忘得差不多了.. 所以现在就当重新学一遍了QwQ 一点口胡的解释 高斯消元. ...

  6. 解方程 ( 迭代法/牛顿迭代/高斯消元 ) 详解及模板

    欢迎访问https://blog.csdn.net/lxt_Lucia-- 宇宙第一小仙女\(^o^)/--萌量爆表求带飞=≡Σ((( つ^o^)つ~ dalao们点个关注呗-- 一.迭代法解方程 ( ...

  7. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

  8. [BZOJ 3143][Hnoi2013]游走(高斯消元+期望)

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...

  9. POJ 2947 Widget Factory (高斯消元解同余方程组)

    题意:N种物品,M条记录,接写来M行,每行有K,str1,str2,表示第i个记录从星期str1到星期str2,做了K件物品,接下来的K个数为物品的编号.求做每个物品所需的时间,并且最后结果在3-9之 ...

最新文章

  1. python3 进程池中使用队列Queue
  2. 不错php文件缓存类,一个不错的PHP文件页面缓存类
  3. 我的家乡-客家小山村
  4. 表示深深的感谢飞鸽传书源码
  5. VS2010与.NET4系列 16.ASP.NET 4 Web Forms 更加干净的HTML标记
  6. 封装性的基本使用练习2
  7. 从石头剪刀布浅谈算法的作用
  8. 【Oracle】表级别分区操作对索引(本地分区索引,全局分区索引,非分区索引)的影响
  9. 【mybatis】mybatis基础知识总结
  10. yocto 打包外部应用到 system.img
  11. Hbase rowkey 设计原则
  12. 项目-2.EVP论文与代码解析(Audio-Driven Emotional Video Portraits)
  13. 2011年中国大陆十佳IC设计公司
  14. Ubuntu连接蓝牙鼠标键盘
  15. 写给我的客户da辉狼
  16. 草履虫纳米机器人_《Nature》:草履虫大小的微型机器人:由激光驱动,未来可用于显微外科手术!...
  17. SSO: Basic-Auth OAuth2 SAML OpeanID
  18. 微信小游戏——贪吃蛇
  19. 傲慢与偏见之 - 山寨与创新
  20. 【遇见大咖】测试界:你的圈子在哪?

热门文章

  1. mysql数据库主要用来做什么的_水晶头骨用来做什么的?
  2. 早教机器人刷固件_机器人线刷包_机器人刷机包_机器人固件包_机器人救砖包 - 线刷宝ROM中心...
  3. java .this的用法_JAVA中this用法小结
  4. apt-get 更新指定软件_GrandPerspective for mac(磁盘管理软件)
  5. 实现option上下移动_用jQuery实现lt;selectgt;选项上下移动 - 不要哀求 学会争取 若是如此 终有所获 - ITeye博客...
  6. Java当中 递归打印文件大小(面向不同的对象打印文件大小)
  7. java中编译类型的方法 和 运行时的类型方法 有什么区别
  8. 荣耀智慧屏功能曝光 首发华为鸿蒙OS,荣耀智慧屏功能曝光:首发华为鸿蒙OS,全场景智慧体验...
  9. 《C++ Primer》13.1.1节练习
  10. Strongly connected HDU - 4635(tarjan+强连通分量)