【NOI2017模拟6.20】树形图求和

SQL开发--树形层次累计求和案例 今天碰到一个朋友找我帮忙写一个 阅读详情

题目

这里写图片描述

解法一

首先对于树形图的个数这样算:
a[i][i]表示i号点的出度,a[i][j]表示从i到j的边个数的相反数
去掉第n行第n列后剩下的矩阵的行列式即为树形图个数
考虑枚举每条边并计算这条边的影响。
就是说我们枚举一条边(x,y)然后a[x][x]–,a[x][y]++重新计算行列式
对于如下矩阵:

A=⎡⎣⎢⎢a1,1⋮an,1⋯⋱⋯a1,n⋮an,n⎤⎦⎥⎥

若我们将第k列改成c[]
即
B=⎡⎣⎢⎢a1,1⋮an,1⋯⋱⋯a1,k−1⋮an,k−1c1⋮cna1,k+1⋮an,k+1⋯⋱⋯a1,n⋮an,n⎤⎦⎥⎥

考虑如下方程:
对于所有i有:∑j=1nai,j⋅xj=ci

那么有:
det(B)=det(A)×xk

上述方程中x为未知数,xi的意义为:把某一列的数加到第k列得到c的系数。
我们可以用c表示出所有的x,当我们需要查询的时候就直接扫一下代入就好了

解法二

而我的解法是这样的:
定义二元组(a,b)表示方案数为a,每种方案的权值和为b。
那么乘法相当于两个二元组的组合,即:

(a,b)×(c,d)=(ac,ad+bc)

相应的也可以推出除法(虽然并没有什么组合意义),加法,减法
而其零元为:(0,0)
其单位元为:(1,0)
然后就可以直接代入进去做高斯消元了
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<set>
#include<bitset>
#include<map>

#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)

using namespace std;

typedef long long LL;
typedef double db;

int get(){
    char ch;
    while(ch=getchar(),(ch<'0'||ch>'9')&&ch!='-');
    if (ch=='-'){
        int s=0;
        while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
        return -s;
    }
    int s=ch-'0';
    while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
    return s;
}

const int N = 310;
const int mo = 1E+9+7;

LL add(LL x,LL y){return x+y>=mo?x+y-mo:x+y;}
LL quickmi(LL x,LL tim){
    LL ans=1;
    for(;tim;tim/=2,x=x*x%mo)
    if (tim%2)ans=ans*x%mo;
    return ans;
}
struct numb{
    LL  a,b;
    numb(const int a_=0,const int b_=0){a=a_;b=b_;}
};
numb operator *(numb a,numb b){return numb(a.a*b.a%mo,add(a.a*b.b%mo,a.b*b.a%mo));}
numb operator +(numb a,numb b){return numb(add(a.a,b.a),add(a.b,b.b));}
numb operator -(numb a,numb b){return numb((a.a+mo-b.a)%mo,(a.b+mo-b.b)%mo);}
numb operator /(numb a,numb b){
    LL tmp=quickmi(b.a,mo-2);
    LL a_=a.a*tmp%mo;
    return numb(a_,((a.b+mo-a_*b.b%mo)%mo)*tmp%mo);
}
numb operator *(numb a,LL x){return numb(a.a*x%mo,a.b*x%mo);}
numb operator /(numb a,LL x){
    LL tmp=quickmi(x,mo-2);
    return numb(a.a*tmp%mo,a.b*tmp%mo);
}

struct matrix{
    numb a[N][N];
    numb* operator [](int x){return a[x];}
}a;
int n,m;
numb d[N];
int fa[N];
numb ny[N];

int getfather(int x){
    if (fa[x]==x)return x;
    return fa[x]=getfather(fa[x]);
}

int main(){
    freopen("calc.in","r",stdin);
    freopen("calc.out","w",stdout);
    n=get();m=get();
    fo(i,1,n)fa[i]=i;
    fo(i,1,m){
        int x=get(),y=get(),v=get();
        int tx=getfather(x),ty=getfather(y);
        fa[tx]=ty;
        numb u=numb(1,v);
        a[x][y]=a[x][y]+u;
        //a[y][x]=a[y][x]+u;
        d[x]=d[x]+u;
        //d[y]=d[y]+u;
    }
    bool bz=1;
    int lst=getfather(1);
    fo(i,2,n){
        int u=getfather(i);
        if (u!=lst){bz=0;break;}
    }
    if (!bz){
        printf("0\n");
        fclose(stdin);
        fclose(stdout);
    }
    fo(x,1,n)
        fo(y,1,n)
        a[x][y]=a[x][y]*(mo-1);
    fo(x,1,n)a[x][x]=d[x];
    n--;
    fo(i,1,n){
        fo(j,1,i-1)
        if (a[i][j].a||a[i][j].b){
            numb tmp=a[i][j]*ny[j];
            fo(x,1,n)a[i][x]=a[i][x]-tmp*a[j][x];
        }
        ny[i]=numb(1,0)/a[i][i];
    }
    numb ans=numb(1,0);
    fo(i,1,n)ans=ans*a[i][i];
    printf("%lld\n",ans.b);
    fclose(stdin);
    fclose(stdout);
    return 0;
}
【NOI2017模拟6.3】子序列 矩阵乘法+DP 准队爷富榄出的题目,被虐的不要不要的,打了个40分还被卡常。。。 题意:给你1个长度为n的字符串,每次给出询问l,r问l,r中有多少个本质不同的子序列。 n,q<=1e5。 一开始差点连题目都没理解清楚,子序列一定不连续,子串才连续= =。。一个并不显然的dp是设f[i][j]表示第i位为j的答案,那么初始f[i][s[i]]=1,然后f[i][j]+=sigma(f[i][1-9]),然后我 阅读详情

相关推荐

SCI论文Discussion写作:如何用AI工具三步打造审稿人认可的深度逻辑框架

本文针对SCI论文Discussion写作的痛点,提出利用AI工具三步构建深度逻辑框架的方法。首先,使用Claude等工具搭建个性化提纲,解决“浅显病”与“混乱症”;其次,高效整合文献与结果,填充证据;最后,优化逻辑衔接与学术语言,打造审稿人认可的流畅论证。该方法强调研究者主导,AI辅助,显著提升写作效率与深度。

weixin_28235513的博客 236

旅游 树形dp

题目:https://ac.nowcoder.com/acm/problem/15748 Cwbc和XHRlyb生活在s市,这天他们打算一起出去旅游。 旅行地图上有n个城市,它们之间通过n-1条道路联通。 Cwbc和XHRlyb第一天会在s市住宿,并游览与它距离不超过1的所有城市,之后的每天会选择一个城市住宿,然后游览与它距离不超过1的所有城市。 他们不想住在一个已经浏览过的城市,又想尽可能多的延长旅行时间。 XHRlyb想知道她与Cwbc最多能度过多少天的时光呢? 聪明的你在仔细阅读题目后,一定可以顺利的

u011612364的博客 624

MTK MT6833平台屏幕与TP驱动移植实战:从FAE伪代码到内核模块集成

本文详细介绍了在MTK MT6833平台上进行屏幕与TP驱动移植的完整实战流程。文章从解析供应商提供的初始化伪代码入手,逐步拆解了在LK阶段点亮屏幕、在内核层集成Panel驱动以支持休眠唤醒,以及移植并调试sitronix_ts触摸驱动的核心步骤与关键技巧,为嵌入式开发人员提供了从零到一集成新硬件的清晰指南。

rnn9storyteller的博客 441

树状数组求和三种模型

1.改变某一元素的值,查询某一区间内所有元素的和(单点更新,区间查询)。 2.把一个区间内的所有元素都加上一个值,查询某一个元素的值(区间更新,单点查询)。 3.把某一个区间内的所有元素都加上一个值,查询某一区间内所有元素的和(区间更新,区间查询)。 第三种操作是转载RoBa大牛的,具体还得深入理解,现在暂当模板。虽然前面说是“区间更新”,或者“区间查询”,但实际上并不能做到像线段树那样完美

sdau20163940的博客 803

OnlyOffice Docker部署踩坑实录:解决Nginx反向代理导致的editor.bin下载失败

本文详细解析了在Docker中部署OnlyOffice时,因Nginx反向代理配置不当导致editor.bin下载失败的常见问题。通过分析问题根源,提供了从Nginx代理配置、Docker网络设置到OnlyOffice容器内部调整的完整解决方案,并分享了实战调试技巧与性能优化建议,帮助用户彻底解决这一部署难题。

wine的专栏 523

描边盛开火玫瑰

python描边盛开火玫瑰 代码如下 import turtle as t t.setup(800,800) t.hideturtle() t.speed(11) t.penup() t.goto(50,-450) t.pensize(5) t.pencolor("black") t.seth(140) t.pendown() t.speed(10) t.circle(-300,60) t.fd(100) #jiaodu80 #1ye t.seth(10) t.fd(50) t.fillcolor("gr

weixin_50973371的博客 2062

[JZOJ5153]树形图求和

题目大意给定一个nn个点mm条边的带权有向图,每条边描述为(ui,vi,wi)(u_i,v_i,w_i)。不存在自环,可能有重边。 请计算出所有的以nn为根的有向生成树(在本题定义为所有边从儿子指向父亲)的权值和,一棵树的权值定义为其所有边的权值和。2≤n≤300,0≤m≤105,1≤ui,vi≤n,1≤wi≤1092\le n\le300,0\le m\le10^5,1\le u_i,v_i\l

待成熟的葡萄 1458

网络发生环路了,别慌,这些步骤一定要安排起来!

网络环路是指在计算机网络中,数据包因为某种原因在多个网络设备之间不断循环,形成了一个闭环。这样数据包就永远也无法到达目标,导致网络的流量滞留,设备间的资源耗尽,最终网络性能受到严重影响。网络环路虽然是常见的网络故障,但只要掌握正确的排查和解决方法,面对环路问题时,你就能冷静应对,迅速恢复网络的正常运行。希望这篇文章能帮助你更好地理解和处理网络环路的问题,让你的网络环境更加稳定可靠!🚀📡如果你有任何疑问,或者在实际操作中遇到困难,随时可以联系我,我们一起攻克技术难题!

网络技术联盟站 1965

【JZOJ 5153】树形图求和

题目 Description Input Output Sample Input 见附加文件 Sample Output 见附加文件 Data Constraint 思路 矩阵树定理 我们考虑分别计算每一条边对答案的贡献;即需要对于每一条边得知包含它的树形图个数有多少个。 对于树形图计数,可以考虑用基尔霍夫矩阵求解。于是朴素的想法就是对于每一条边,将它相连的两个端点合并成一个点,然后求出树形图个数以更新答案。 事实上,包含一条边的树形图个数,就是总共的树形图个数减去不包含这条边的树形图个数。而不包含

Brute♂force 606

【专栏必读】王道考研408数据结构+算法设计与分析万字笔记使用说明及章节导航

各位老铁思维导图在我整理完笔记后会放上去的,我需要根据王道的思维导图重新再做一遍 文章目录一:有关注意事项二:关于专栏三:学习建议四:各专栏导航(各位老铁别催,质量优先)(1)第一章:绪论(2)第二章:线性表(3)第三章:栈和队列第四章:串第五章:二叉树第六章:图 首先感谢王道大大(手动比心),很用心在做了,大家可以看其中两节是否符合胃口 (王道408考研数据结构)第五章树-第三节1:二叉树遍历(先序、中序和后序) (王道408考研数据结构)第五章树-第四节2:平衡二叉树(AVL)及其旋转 一:有.

快乐江湖的博客 5万+

leaflet 综合教程170+ 【目录 】(已包含162篇文章)

vue+leaflet系列教程旨在为开发者提供简单快捷的,。在每一个示例中,解释相应的API知识点,做到。注意本示例目录中的内容可能加载是vue+openlayers的示例, 本目录是要加载vue+leaflet的示例,只是内容少,逐渐更新中。

大剑师兰特的GIS世界 1万+

js数组树形结构(求子节点所有父祖先和while求和)

【代码】js数组树形结构(求子节点所有父祖先和while求和)

Davidzw99的博客 711

【TC397第23篇】深度解析TC397 EB MCAL开发系列:UART配置与POLL模式数据交互

通过本文,我们深度解析了TC397 EB MCAL开发系列中UART配置的POLL模式下的数据交互。从技术要点的介绍到实际案例的演示,希望读者能够更好地理解UART在POLL模式下的配置与应用。这不仅是对嵌入式系统开发的一次深刻探索,更是为项目提供了一种高效通信的解决方案。在未来的文章中,我们将继续深入研究嵌入式系统开发的各个方面,为广大开发者提供更多实用的技术知识。敬请期待,一同迎接嵌入式技术的新篇章!

一直在水些技术小文 470

【JZOJ5153】树形图求和 题解

题目大意      N<=300,M<=1e5,w<=1e9~~~~~~N<=300,M<=1e5,w<=1e9\\【60%】n<=50,m<=200

Four's 1104

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

提高组模拟考试笔记(2016质数序列,种花,挺进)

一开始,小Z会出生在一个有宝箱的房间(系统还是有点良心的),然后小Z“咚咚咚咚”一路过关斩将走到有另外一个宝箱的所在地(显然小Z走最短路),到达第二个宝箱所在地后,系统会又很良心地把他送到另一个连通块的某个宝箱处,然后小Z又“咚咚咚咚咚”,拿到了最后一个宝箱。小Z又开始了ETG。与此同时,观察黄线,同理,这个时候斜率是过大的,就要将k调小。黑线作为所有m和n的对应,我们就是要求出n的值,但是很明显m和n不是一一对应的关系,我们就是要去求这个红线的k,b值,就比如在这个环中,开始有一个x值能够提供的价值是。

weixin_43667715的博客 174

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

2016浙江省赛过山车记

省赛后一天就是期中考真刺激,可以体验连续滚粗的快感。 听说今天是鸟神的生日,于是凌晨造了个大新闻,强行给鸟神灌了一大口毒奶。 热身赛写模拟写到结束也没调出来,给下午滚粗奠定了坚实的基础。 正赛,打开题目,习惯性地先从最后一题开始看,于是我发现L题就是个签到题,花1分钟敲完,打算抢FB。 正打算交的时候,网卡了,,刷了两三分钟才刷新出来,然后L题已经过了一片了。 然后南神说I题可做...

weixin_34064653的博客 148

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[线代小记] 树形图求和

未经允许搬了过来代码略丑#include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; typedef long long ll;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+f

雯舞 1004

树形结构节点求和,以及set排序

有个map,key值是code,value是金额,想通过下级code获得上级code的金额。例如下图: 00的value的和等于0001+0002的和,依次类推。 代码: package com.iss.itms.budgetmanage.budgeting.budgetimport; import java.util.ArrayList; import java.u...

weixin_30896763的博客 1266

【MPI编程】任意数节点的树形求和(高性能计算)

简述 之前写过一个只能在2幂次数的节点环境下使用的树形结构求和 【MPI编程】2幂节点的树形求和(高性能计算) 稍微修改了一下对应代码,就可以使用了。其实就是在逻辑上扩充一下为2的幂数。也就是说接受节点上的只要不越界就是任然要接受。如果越界了,就说明对应的在后面的节点是不存在的。那么就保留当前节点就好了。 运行效果 输入为一个文件: 内容为: 19 1 2 3 4 5 6 7 8 9 10 2 3...

gc.collect() 1528

树状数组及求和

1.概念 给定一个n个数字的数列,要求一下操作: ①改变第k个数字,增加或减少一个值; ②查询第i个到第j个数的和 一般数组解法: O(1) O(n); 树状数组 O(logn) O(logn); 2.构建 假设给定数列A[1]->A[8] 序列C[]为树状数组 特点: (1)满二叉树,且二叉树中的每个叶子节点为A[]的一个元素 (2) C[i]为A[i]对应的那一列的最高的节点 找出规律: i的二进制中从右到左连续0为x,则C[i...

qq_51758329的博客 439

2015暑假集训总结

2015暑假集训总结(顺带一些不屑的谴责)

samjia2000的博客 1960

将满二叉树转换为求和树

将满二叉树转换为求和树 给满出二叉树,编写算法将其转化为求和树 什么是求和树:二叉树的求和树, 是一颗同样结构的二叉树,其树中的每个节点将包含原始树中的左子树和右子树的和。 二叉树: 10 / -2 6 / \ / \ 8 -4 7 5 求和树: 20(4-2+12+6) / 4(8-4) 12(7+5) / \...

weixin_42809993的博客 1019

loj6172 Samjia和大树(树形DP+找规律)

题目: https://loj.ac/problem/6172 分析: 首先容易得出这样的dp式子 然后发现后面那个Σ其实是两段区间,可以用总和减去中间一段区间表示,所以只要维护个前缀和就ok了 这样复杂度就是O(nm)的 但是题目中的m异常巨大,有1e9,好像不能用dp做 但我们可以找下规律,发现对于一个点,其所有dp值是前后对称的,而且中间有很长的一段都是相同的数字! 设某...

weixin_30697239的博客 267
上一篇: SRM 664 hard BearSorts题解搬运
下一篇: CF228D Fox and Perfect Sets
samjia2000
博客等级 码龄12年 102粉丝 122原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值