YbtOJ#893-带权的图【高斯消元,结论】
正题
题目链接:https://www.ybtoj.com.cn/problem/893
题目大意
给出一张\(n\)个点\(m\)条边的无向联通图,每条边正反向各有\(A,B,C\)三种边权。
保证满足
\]
\]
且对于每个环\([v_1,v_2...v_n](v_1=v_n)\)
\]
现在给你\(A,B\)边权,求\(C\)边权。
数据保证解唯一,所有限制都在模\(P\)意义下
\(n\in[1,100],m\in[1,2000],P\in[1,10^{18}]\cup Pri\)
解题思路
最后一个环的限制很麻烦,因为环很多。
先考虑原图的任意一颗生成树\(T\)上,对于任意一条非树边\((u,v)\)可以表示一个\(u->v->u\)的环。并且因为反过来走边权为负,所以你可以通过用一些小环相互抵消出一个大环。
结论就是所有的环都可以被一些用非树边表示的环相互抵消表示。所以我们就可以将环的数量减少到\(O(m)\)级别了。
暴力消元\(O(m^3)\)显然无法通过本题,我们还需要优化。
设\(D_{x,y}=B_{x,y}\times C_{x,y}-A_{x,y}\),那么第一个条件就表示成了每个环\(D\)的和为\(0\)。
并且还能发现一个性质,对于一个非树边表示的环\((x,y)\),
\]
(其中\(path(x,y)\)表示树上路径\(x,y\)的\(D\)值和)
所以可以证明从\(x\)走到\(y\)的所有路径权值相同
那么我们可以设\(f_x=path(1,x)\),那么\(D_{x,y}=f_y-f_x\)。
这样对于每个点就可以根据\(C\)的限制列出一个方程
\]
然后高斯消元即可,时间复杂度\(O(n^3)\)
注意模数比较大,要写龟速乘
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-带权的图【高斯消元,结论】的更多相关文章
- 4.23 子串 AC自动机 概率期望 高斯消元
考虑40分. 设出状态 f[i]表示匹配到了i位还有多少期望长度能停止.可以发现这个状态有环 需要高斯消元. 提供一种比较简单的方法:由于期望的线性可加性 可以设状态f[i]表示由匹配到i到匹配到i+ ...
- POJ 2947-Widget Factory(高斯消元解同余方程式)
题目地址:id=2947">POJ 2947 题意:N种物品.M条记录,接写来M行,每行有K.Start,End,表述从星期Start到星期End,做了K件物品.接下来的K个数为物品的 ...
- [CF963E]Circles of Waiting[高斯消元网格图优化+期望]
题意 你初始位于 \((0,0)\) ,每次向上下左右四个方向走一步有确定的概率,问你什么时候可以走到 以 \((0,0)\)为圆心,\(R\) 为半径的圆外. \(R\le 50\) 分析 暴力 \ ...
- Educational Codeforces Round 63 (Rated for Div. 2) E 带模高斯消元
https://codeforces.com/contest/1155/problem/E 题意 \(f(x)=a_0+a_1x+a_2x^2+...+a_kx^k,k \leq 10,0 \leq ...
- BZOJ 3143 HNOI2013 游走 高斯消元 期望
这道题是我第一次使用高斯消元解决期望类的问题,首发A了,感觉爽爽的.... 不过笔者在做完后发现了一些问题,在原文的后面进行了说明. 中文题目,就不翻大意了,直接给原题: 一个无向连通图,顶点从1编号 ...
- bzoj 2115: [Wc2011] Xor xor高斯消元
2115: [Wc2011] Xor Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 797 Solved: 375[Submit][Status] ...
- 线性空间和异或空间(线性基)bzoj4004贪心+高斯消元优秀模板
线性空间:是由一组基底构成的所有可以组成的向量空间 对于一个n*m的矩阵,高斯消元后的i个主元可以构成i维的线性空间,i就是矩阵的秩 并且这i个主元线性无关 /* 每个向量有权值,求最小权极大线性无关 ...
- BZOJ 3143 游走(贪心+期望+高斯消元)
一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...
- 【BZOJ】2337: [HNOI2011]XOR和路径 期望+高斯消元
[题意]给定n个点m条边的带边权无向连通图(有重边和自环),在每个点随机向周围走一步,求1到n的期望路径异或值.n<=100,wi<=10^9. [算法]期望+高斯消元 [题解]首先异或不 ...
随机推荐
- Linux 记录学习
- 关于在mysql和oracle中编码对varchar等类型的影响
今天在测试oracle的时候发现,我用varchar2(10),的字段,居然存不下"凯尔特人"四个字符:和我在学习mysql中显然是不一样的,查阅资料发现: mysql 5.0 之 ...
- default错误
查看根目录发现 修改成index.php可以了
- js调试之firbug
说下几种方法吧: 1.用alert 这个最最直观 把你想要的内容弹出来给你看,但是要看哪里 就要在哪里加,比较麻烦 2.用firefox 或者chrome浏览器 里面有debug工具的 3.如果想用i ...
- “ShardingCore”是如何针对分表下的分页进行优化的
分表情况下的分页如何优化 首先还是要给自己的开原框架打个广告 sharding-core 针对efcore 2+版本的分表组件,首先我们来快速回顾下目前市面上分表下针对分页常见的集中解决方案 分表解决 ...
- Django分页组件——Paginator
from django.core.paginator import Paginator #导入Paginator objects = ['john','paul','george','ringo',' ...
- nRF52832蓝牙iBeacon广播
开发环境 SDK版本:nRF5_SDK_15.0.0 芯片:nRF52832-QFAA 蓝牙iBeacon实现 iBeacon的核心就是广播,不需要进行连接,通过在广播包中插入信息然后广播出去. 广播 ...
- Tensorflow保存神经网络参数有妙招:Saver和Restore
摘要:这篇文章将讲解TensorFlow如何保存变量和神经网络参数,通过Saver保存神经网络,再通过Restore调用训练好的神经网络. 本文分享自华为云社区<[Python人工智能] 十一. ...
- vue 动态ip配置,避免重复打包
目前比较流行的打包大都是在vue.config.js配置代理,然后在根目录新建.env.xxx文件配置正式环境,测试环境,开发环境等用于打包时配置不同的访问地址,作为一名随波逐流的前端开发,我也是这么 ...
- Flex语法和常用鼠标手势
Flex弹性和模型 1.display : flex/inline-flex ;(设置给氟元素) flex : 将对象作为弹性伸缩盒显示: inline-flex : 将对象作为内联块级弹性伸缩显示: ...