同余最短路学习笔记
同余最短路学习笔记
前言
因为没有做出来简单的同余最短路,遂来写一篇学习笔记涨涨记性。
正文
同与最短路,其实是一种类似完全背包的算法,求的东西都是一样的,但是同余最短路可以求的范围更广。
通常情况下表达式都是 $\sum_{i=1}^{n} a_ix_i =b $ 是否可行的情况。
这里的 a,b 都是已知的,而 xi≥0 这样的情况就可以直接用同余最短路,求出每一个对 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))
这题需要略微转化,就可以得到 ∑xi∗ai 的式子了,也是比较简单就可以实现了的。