同余最短路

主要内容

形如:

  • 设问 \(1\) :给定 \(n\) 个整数,求这 \(n\) 个整数在 \(h(h\le2^{63}-1)\) 范围内 能拼凑出多少的其他整数(整数可以重复取)
  • 设问 \(2\) :给定 \(n\) 个整数,求这 \(n\) 个整数 不能拼凑出的最小(最大)的整数

的问题可以使用 同余最短路 的方法 。

同余最短路利用同余来构造一些状态,可以达到 优化空间复杂度 的目的。

解决方案

\(x\)\(n\) 个数中最小的一个,令 \(ds[i]\) 为只通过增加其他 \(n-1\) 种数能够达到的最低楼层 \(p\) ,并且满足 \(p\equiv i\pmod{x}\)

对于 \(n-1\) 个数与 \(x\)\(ds[i]\) ,可以如下连边:

for(int i=0;i<x;i++) for(int j=2;j<=n;j++) add(i,(i+a[j])%x,a[j]);

之后进行最短路 ,对于 :

\[\sum_{i=0}^{x-1}{[d[i]\le h]\times\dfrac{h-d[i]}{x}+1} \]

  • 设问 \(2\) :( 如 P2662 牛场围栏 ) 答案为:( \(i\) 一定时最小表示的数为 \(d[i]=s\times x+i\) ,则 \((s-1)\times x+i\) 一定不能 被表示出来 )

\[\min_{i=1}^{x-1}{\{d[i]-x\}} \]

注意:\(ds\)\(h\) 范围相同,一般也要开 \(\operatorname{long}~\operatorname{long}\) !

其他例题

CF516E Drazil and His Happy Friends

发现只有对 \(\gcd(n,m)\) 取模相同的那些数才可能互相到达,不妨将他们按照余数分开处理。对男生全部完成、女生全部完成的最大时间取 \(\max\) 就是当前余数的最大时间。

以求出女生最大时间为例,设当前余数下有 \(n\) 个男生,\(m\) 个女生。

  • 如果第 \(i\) 个男生是快乐的,那么在 \(i\) 时间会让编号为 \(i\bmod m\) 的女生变得快乐;在经过 \(n\) 时间后,他会让编号为 \((i+n)\bmod m\) 的时间变得快乐;经过 \(kn\) 时间后,会让编号为 \((i+kn)\bmod m\) 的女生变得快乐……
  • 不妨考虑在女生之间转移,如果 \(i\) 号女生当前是快乐的,她可以通过男生在 \(n\) 时间后让编号为 \((i+n)\bmod m\) 的女生变得快乐,这样如果按照 \(i\Rightarrow (i+n)\bmod m\) 的顺序不断传递,所有女生都会连接成一个大环,以 \(n\) 时间为周期依次将下一个女生变得快乐。最后一个变得快乐的女生就是最大时间。

由于 \(n,m\) 的范围高达 \(10^9\),肯定不能够真的将上面的大环建出来,考虑用数学意义完成:

\[i\Rightarrow (i+n)\mod m\\ \dfrac{i}{n}\times n\Rightarrow \dfrac{i+n}{n}\times n\mod m\\ \dfrac{i}{n}\times n\Rightarrow \left(\dfrac{i}{n}+1\right)\times n\mod m \]

但是其中的除法怎么做?exgcd!!在按照 \(\gcd{n,m}\) 余数分类后,除去 \(\gcd\) 因子,可以求出 \(n,m\) 互相的逆元,满足 \(nx\equiv 1\pmod{m},my\equiv 1\pmod{n}\)

这样就可以根据 \(\frac{i}{n}\) 快速对 \(m\) 中有用的女生排序,相邻两个女生就是环上最接近的两个有用的女生。在其中循环一遍求出最大时间即可。

posted @ 2022-11-07 19:03  EricQian06  阅读(28)  评论(0编辑  收藏  举报