首页 > 其他分享 >NOI2021 路径交点

NOI2021 路径交点

时间:2023-10-27 09:15:11浏览次数:35  
标签:typedef mat ll 路径 long NOI2021 交点 define

洛谷传送门

LOJ 传送门

两条路径的交点数量只和起点数量有关。容易发现是终点排列的逆序对数的奇偶性。求一个 \(f_{i, j}\) 表示从第 \(1\) 层的第 \(i\) 个点到第 \(k\) 层的第 \(j\) 个点的路径数量,对这个矩阵求行列式即可。

对于相交的路径数不用考虑,因为总存在和它对应的一条路径,满足两条路径的终点排列的逆序对数一奇一偶(LGV 引理的本质)。

code
// Problem: P7736 [NOI2021] 路径交点
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P7736
// Memory Limit: 1 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 210;
const ll mod = 998244353;

inline ll qpow(ll b, ll p) {
	ll res = 1;
	while (p) {
		if (p & 1) {
			res = res * b % mod;
		}
		b = b * b % mod;
		p >>= 1;
	}
	return res;
}

ll n, a[maxn], b[maxn];

struct mat {
	ll n, m, a[maxn][maxn];
	mat(ll _n = 0, ll _m = 0) {
		n = _n;
		m = _m;
		mems(a, 0);
	}
} A;

inline mat operator * (const mat &a, const mat &b) {
	mat res(a.n, b.m);
	for (int k = 1; k <= a.m; ++k) {
		for (int i = 1; i <= a.n; ++i) {
			for (int j = 1; j <= b.m; ++j) {
				res.a[i][j] = (res.a[i][j] + a.a[i][k] * b.a[k][j]) % mod;
			}
		}
	}
	return res;
}

inline ll det(mat A) {
	ll ans = 1, n = A.n;
	for (int i = 1; i <= n; ++i) {
		for (int j = i; j <= n; ++j) {
			if (A.a[j][i]) {
				if (i != j) {
					swap(A.a[i], A.a[j]);
					ans = (mod - ans) % mod;
				}
				break;
			}
		}
		if (!A.a[i][i]) {
			return 0;
		}
		ans = ans * A.a[i][i] % mod;
		ll t = qpow(A.a[i][i], mod - 2);
		for (int j = i; j <= n; ++j) {
			A.a[i][j] = A.a[i][j] * t % mod;
		}
		for (int j = 1; j <= n; ++j) {
			if (i == j) {
				continue;
			}
			ll t = (mod - A.a[j][i]) % mod;
			for (int k = i + 1; k <= n; ++k) {
				A.a[j][k] = (A.a[j][k] + t * A.a[i][k]) % mod;
			}
		}
	}
	return ans;
}

void solve() {
	scanf("%lld", &n);
	for (int i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
	}
	for (int i = 1; i < n; ++i) {
		scanf("%lld", &b[i]);
	}
	A = mat(a[1], a[1]);
	for (int i = 1; i <= a[1]; ++i) {
		A.a[i][i] = 1;
	}
	for (int i = 1; i < n; ++i) {
		mat B(a[i], a[i + 1]);
		for (int _ = 0, u, v; _ < b[i]; ++_) {
			scanf("%d%d", &u, &v);
			B.a[u][v] = 1;
		}
		A = A * B;
	}
	printf("%lld\n", det(A));
}

int main() {
	int T = 1;
	scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,mat,ll,路径,long,NOI2021,交点,define
From: https://www.cnblogs.com/zltzlt-blog/p/17790972.html

相关文章

  • 利用路径绘制荷塘月色图
     视频网址:链接:https://pan.baidu.com/s/1AsUx1m9DAzamyy60hUUibQ提取码:gytx--来自百度网盘超级会员V4的分享......
  • 顺丰控股的盈利能力分析及提升路径研究—论文文档
    目录摘要 IAbstract II一、绪论 1(一)研究背景与研究意义 11.研究背景 12.研究意义 1(二)文献综述 21.国外文献研究现状 22.国内文献研究现状 33.文献述评 4(三)研究内容和方法 41.研究内容 42.研究方法 4二、相关理论概述 5(一)企业盈利能力相关理论概述 51.盈利能力的含......
  • 2023-10-26 ts报异常:并非所有代码路径都返回值 ==》给一个默认的返回值
    在函数中添加了判断且包含了return,如:if(isTrial){returnalert("666");}那么ts就会报这个异常,这也不算错误,但从ts的严格模式来看,是要给定一个默认返回值才行。解决方案:if(isTrial){returnalert("666");}returnaler......
  • SpringMVC-通过路径传收参数
    还有一种通过路径传输参数,效果如下实现:packagecom.aurora.path;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.PathVariable;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springfr......
  • SpringBoot路径匹配
    Spring5.3之后加入了更多的请求路径匹配的实现策略;以前只支持AntPathMatcher策略,现在提供了PathPatternParser策略。并且可以让我们指定到底使用那种策略。1.Ant风格路径用法Ant风格的路径模式语法具有以下规则:*:表示任意数量的字符。?:表示任意一个字符。**:表示......
  • python引用相对路径
    文件夹ants/bees文件夹与learn_data.py隶属于同一个目录data_process   所以引用相对路径的方式即为:classMyData(Dataset):def__init__(self,root_dir,label_dir):self.root_dir=root_dir#根目录,即hymenoptera_data/trainself.label_......
  • python当前工作目录和当前文件的绝对路径
    当前文件的绝对路径:这个就是文件在硬盘上的真实路径,从盘符一直到文件所在的具体位置。当前工作目录(currentworkingdirectory)是文件系统当前所在的目录,如果命令没有额外指定路径,则默认为当前工作目录。    importos#当前文件的绝对路径print(os.path.abspath(......
  • # 由于我只能访问hugginface网站,但是不能下载里面的数据,所以编写下面的代码,获取从hugg
    #由于我只能访问hugginface网站,但是不能下载里面的数据,所以编写下面的代码,获取从huggingface下载数据的链接。在从其它路径下载数据。#获取huggingface某个模型所有要下载数据的命令行。#可以把结果复制到autodl里,进行执行。速度可以达到13M/s#然后在autodl里进行训练推理......
  • Linux绝对路径和相对路径
    在Linux中,简单的理解一个文件的路径,指的就是该文件存放的位置。只要我们告诉Linux系统某个文件存放的准确位置,那么它就可以找到这个文件。指明一个文件存放的位置,有2种方法,分别是使用绝对路径和相对路径。我们知道,Linux系统中所有的文件(目录)都被组织成以根目录“/”开始的倒......
  • python通过脚本路径获取对应脚本里的内容
    importinspectfromimportlib.utilimportspec_from_file_location,module_from_specscript_path="test.py"spec=spec_from_file_location("test",script_path)module=module_from_spec(spec)spec.loader.exec_module(module)print(modul......