链接
先用multiset(或手写平衡树)预处理出打每条龙用的剑伤害值,记为 Bi
注意:题意意思是只能攻击一个来回
正题
根据题意可以写出方程:
⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧B1x≡A1 (mod P1)B2x≡A2 (mod P2).........Bnx≡An (mod Pn)
几个问题:
- 模数P不两两互质
- x 前有系数
考虑用扩展CRT
的思想转化
设在求解第 i 项方程的解,已经解出前i−1个方程的解 x,记前i−1 个P的最小公倍数为m
尽管x前有系数,但仍然满足x的通解为x+km
对于方程(忽略下标)
Bx≡A (mod P)
转化为
B(x+km)≡A (mod P)
展开移项
mB×k≡A−Bx (mod P)
将k设为未知数,其实这就是一个同余方程,转化如下(x是已知),未知数为 k 和 y
mB×k+P×y=A−Bx
求解得到最小的k,则新方程的解为x+km
更新完x之后更新m,进行下一步求解
坑点
所以这题就做完了吗?当然没有!,NOI题怎么能这么水
- 这题数字巨大,中途会爆
long long
,请使用龟速乘(或者int128)
- x脱离了问题本身,如果x次没有把血打成负的也是不行的,所以在求解完后要使用通解式x+km得到不小于最大攻击次数下限中最小的解
- 求解剑的时候用
upper_bound
(好像就我有这个问题)