同余最短路学习笔记

同余最短路学习笔记

前言

因为没有做出来简单的同余最短路,遂来写一篇学习笔记涨涨记性。

正文

同与最短路,其实是一种类似完全背包的算法,求的东西都是一样的,但是同余最短路可以求的范围更广。

通常情况下表达式都是 $\sum_{i=1}^{n} a_ix_i =b $ 是否可行的情况。

这里的 a,b 都是已知的,而 xi0 这样的情况就可以直接用同余最短路,求出每一个对 ai 的剩余系都搞出一个最小能生成的值,后面的数都直接加 ai 即可。

这样的时间复杂度通常为 O(naloga)

模板:

void bfs(){
	memset(p,0x3f,sizeof p); 
	p[0]=0;
	priority_queue<int,vector<int>,greater<int>>q;
	q.push(0);
	while(!q.empty()){
		int x=q.top();
		q.pop();
		for(int i=2;i<=n;i++){
			if(p[(a[i]+x)%a[1]]>a[i]+x){
				q.push(a[i]+x);
				p[(a[i]+x)%a[1]]=a[i]+x;
			}
		}
	} 
	for(int i=0;i<a[1];i++){
		if(p[i]>r)continue;
		ans+=(r-p[i])/a[1]+1;
		if(l-1>=p[i])ans-=(l-1-p[i])/a[1]+1;
	}
	cout<<ans;
}

例题:[墨墨的等式]([P2371 国家集训队] 墨墨的等式 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)),[跳楼机](P3403 跳楼机 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

这题很简单,直接套模板即可。

例题:[[POI 2003] Sums]([P8060 POI 2003] Sums - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

这题需要略微转化,就可以得到 xiai 的式子了,也是比较简单就可以实现了的。

posted @ 2025-02-10 14:22  hnczy  阅读(7)  评论(0编辑  收藏  举报