首页 > 其他分享 >同余最短路

同余最短路

时间:2024-12-13 20:09:50浏览次数:3  
标签:int 短路 整数 拼凑出 dp 同余

同余最短路

同余最短路可以用于解决形如 "给定 \(n\) 个整数,求这 \(n\) 个整数能拼凑出多少的其他的整数( \(n\) 个整数可以重复选取)" 以及 "给定 \(n\) 个整数,求这 \(n\) 个整数不能拼凑出的最小(最大)的整数",或者 "至少要拼几次才能拼出模 \(k\) 余 \(p\) 的数 的问题的时候可以使用同余最短路的方法。

同余最短路利用同余来构造一些状态,可以达到优化空间复杂度的目的。
类比差分约束的方法,利用同余构造的这些状态可以看作单源最短路中的点,同余最短路的状态转移通常是这样的: \(f_{i+j}=f_i+j\) ,类似单源最短路中的 \(f_v=f_u+edge(u, v)\) 。

下面来看一下板题
Small Multiple

要求\(K\)的倍数?,不就是K等于0

考虑建立\(0\sim {K-1}\)z这些虚点存${\color{Red} 模K余i的数的最小数位和} $

如何转移,发现乘10后数位和不变,那么枚举乘10后加\(1\sim 9\)后这个数模\(K\)是多少不就行了

#include <bits/stdc++.h>
#define int long long
using namespace std;

int n;

int vis[1001000],dp[1001000];

priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q;

void dij() {
	memset(dp,0x3f,sizeof(dp));
	for(int i=1;i<=9;i++) {  q.push({i,i%n}),dp[i%n]=min(dp[i%n],i);}
//	cout<<dp[0];
	while(!q.empty()) {
		int k=q.top().second;
		q.pop();
		if(vis[k]) continue;
		vis[k]=1;
		for(int i=0;i<=9;i++) {
			int v=(k*10+i)%n;
			if(dp[v]>i+dp[k]) {
				dp[v]=i+dp[k];
				q.push({dp[v],v});
			}
		}
	}
}



signed main() {
    cin>>n;  
    if(!n) cout<<0<<endl;
	return 0;
}`

标签:int,短路,整数,拼凑出,dp,同余
From: https://www.cnblogs.com/MortisLife/p/18605769

相关文章

  • Dijkstra 最短路径算法
    此篇文章在2023年9月28日被记录Dijkstra算法的核心点是贪心算法:不断寻找最短的点,在最短的点上更新最短路径1.前言想要了解学习Dijkstra算法,需要先了解无向图与权重图,无向图顾名思义就是没有方向的图,下面表示了有向图和无向图以及权重图2.什么是Dijkstra算法Dijkstra算法......
  • 课程设计/单源最短路径问题的求解
    一、问题分析    问题描述:给定一个带权有向图G=(V,E),其中每条边的权是一个实数。另外,还给定V中的一个顶点,称为源。现在要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和,这个问题通常称为单源最短路径问题。该问题的经典求解方法为迪克斯特......
  • [模板] 单源最短路 Dijksra
    单源最短路:Dijksra单源最短路,时间复杂度\(O(nlog(n+m))\)不适用于有负权边的图#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;structedge{intto,w;};vector<vector<edge>>adj;vector<int>dis;vector<bool>vis;intn,m,......
  • 图常见算法大全( 三种遍历算法 + 三种最短路径算法 + 两种最小生成树)
    图的经典算法完整版万字原文见史上最全详解图数据结构一、图的遍历算法1.voidDFS(intstartVertex);2.voidBFS(intstartVertex);3.voidTopologicalSort();(两种实现方式)1.DFS(深度优先搜索)算法原理是一种用于遍历或搜索图(包括树)中节点的算法。其基本思想......
  • 迪克斯特拉算法:单源最短路径问题
    一、迪杰斯特拉算法的介绍迪杰斯特拉(Dijkstra)算法是一种用于计算加权图中单源最短路径的经典算法,由荷兰计算机科学家艾兹赫·迪杰斯特拉(EdsgerDijkstra)于1956年提出。迪杰斯特拉算法的核心思想是通过贪心策略,不断选择当前路径代价最小的节点,并逐步扩展搜索范围,直到找到从源节......
  • 区间同余问题
    区间同余问题例题:CF2050FMaximummoduloequality题意给定一个长度为\(n\)的序列\({a_n}\),有\(Q\)个询问,每次询问给定一个区间\([l,r]\),让你找一个最大的\(m\),使得区间内所有的\(a_i\modm\)相同,可以证明一定存在这样一个\(m\)(\(1\))。分析看着很头痛,因为完全不......
  • 【图论】单源最短路径 Dijkstra
    单源出发,最短路径,松弛。Dijkstra算法是所有最短路径算法中某种意义上最快的,只是代码略为难写。松弛Dijkstra算法的精髓,就是两个字:松弛。包括所有的最短路径算法,都依靠的是这个词。何为松弛?假设现有若干个点,点\(v\)到起点的最短路径很大,但是有另一个点\(u\),它的路径值较......
  • 数据结构——图(遍历,最小生成树,最短路径)
    目录一.图的基本概念二.图的存储结构1.邻接矩阵2.邻接表三.图的遍历1.图的广度优先遍历2.图的深度优先遍历四.最小生成树1.Kruskal算法2.Prim算法五.最短路径1.单源最短路径--Dijkstra算法2.单源最短路径--Bellman-Ford算法3.多源最短路径--Floyd-Warshall算法......
  • 【编程】C++ 中逻辑与运算符 `&&` 具有短路求值的特性在assert中的应用
    关于assert在C++中使用条件&&字符串格式的示例以及对其宏定义解析的相关说明:1.assert基本介绍及示例使用在C++中,assert是一个宏定义,它位于<cassert>头文件(在C中是<assert.h>)中,用于在程序开发阶段进行调试检查。它的基本语法形式是assert(表达式),当......
  • ospf-开放式最短路径优先协议
    一、为什么会有OSPF1、OSPF可以管理大型复杂政企网络,数据中心网络2、OSPF快速检查网络变化,迅速更新路由,保证公司网络不中断,提高网络的可靠性3、OSPF引入区域,可以支持网络扩展,降低设备压力,提高数据转发效率4、OSPF支持认证,能够增强网络的安全性二、OSPF应用场景主要应用......