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. [算法]期望+高斯消元 [题解]首先异或不 ...
随机推荐
- 两款轻量级服务器 Http-server && SimpleHTTPServer
Http-server # 全局安装 npm install http-server -g # 启动服务 # 禁用缓存 http-server -c-1 # 在当前目录下的www启动服务器 http- ...
- SpringBoot整合mybatis快速入门
一.创建一个SpringBoot项目 二.引入相关依赖 <!--web核心依赖--> <dependency> <groupId>o ...
- jQuery中的筛选(六):first()、last()、has()、is()、find()、siblings()等
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <hea ...
- Hibernate框架基本使用
时间:2017-1-16 00:36 --什么是Hibernate Hibernate是一个开放源代码的关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以使用对象编程思 ...
- hdfs数据迁移
有时候可能会进行hadoop集群数据拷贝的情况,可用以下命令进行拷贝 需要在目标集群上来进行操作 hadoop distcp hdfs://192.168.1.233:8020/user/hive/w ...
- 高德地图——searchNearBy()
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script ty ...
- zigzag走线原理及应用
电路板上弯弯扭扭的走线有什么用 往期文章: 一文读懂高速互联的阻抗及反射(上) 一文读懂高速互联的阻抗及反射(中) 前面几篇文章有部分读者反馈太深奥,不好懂,要求来一点轻松易懂的.这不,它来了!本期文 ...
- centos7安装privoxy
本文分为三部分,第一部分是在阿里云的ECS上安装Privoxy,第二部分是在AWS的EC2上安装Privoxy,第三部分是Privoxy的配置. 第一部分:阿里云ECS安装Privoxy 配置yum源 ...
- adb 常用命令大全(1)- 汇总
adb 常用命令大全系列 基础命令 查看手机设备信息 应用管理 日志相关 模拟按键输入 其他实用功能
- openswan协商流程之(二):main_inI1_outR1()
主模式第二包:main_inI1_outR1() 文章目录 主模式第二包:main_inI1_outR1() 1. 序言 2. `main_inI1_outR1()`处理流程图 3. `main_in ...