P3403 跳楼机
不妨令\(x<y<z\)
设\(f_i\)的值为最小的满足\((ay+bz)\bmod x=i\)的\(ay+bz\),那么对于任意\(\leq h\)的\(f_i+bx\)全都满足条件。只要求出所有\(f_i(0\leq i<x)\)就可以计算出可拼出的所有数,反证如下:
假设存在\((cy+dz)\bmod x = i\),则有
\(cy+dz\equiv ay+bz\pmod x\rightarrow cy+dz=ay+bz+kx\)
而\(f_i\)又是最小的\(ay+bz\),可知\(k\)必定为正,所以没有遗漏。
接下来考虑求出\(f_i\),发现对于每一个\(f_i\)都有:
\(f_i+y\geq f_{(i+y)\bmod x}\)
\(f_i+z\geq f_{(i+z)\bmod x}\)
证明:
以第一个为例,假设已经求出了\((ay+bz)\bmod x=i\),可得\(f_i\equiv i\pmod x\)
同余式两边同加\(y\),则有\(f_i+y\equiv i+y\pmod x\),而又有对应的\(cy+dz\equiv i+y\pmod x\)使得\(f_{(i+y)\bmod x}=cy+dz\),则有\(f_{(i+y)\bmod x}\equiv i+y\pmod x\),易得:
\(f_i+y\geq f_{(i+y\bmod x)}\longrightarrow f_i+y\geq f_{(i+y)\bmod x}\)
得证。(证了我半个小时,或将成为
全网同余最短路题解中这个式子唯一详细证明数学最差的一集)
接下来直接差分约束建图,跑最短路即可,由于不存在负环的可能性,任意最短路算法均可做,思考一秒钟易得\(f_0=0\),从0号点开始跑即可,由于已经确定\(f_0\)的值且该值为最小值,那么跑出来的所有值均为最小值,满足要求。求答案即为:
加一是因为\(f_i\)本身也算一个。
注意让\(x\)最小并非强制,但\(x\)关系到图中点的数量,\(x\)越小效率越高,可以特判\(x/y/z=1\)の情况,输出h即可